2009-05-16 10 views
0

参照のイテレータへの参照を取得する必要があります。しかし、私のコンパイラはこのコードで窒息しています:テンプレートイテレータの参照の参照を取得する

template <typename InputIterator> size_t iLongestBegin(InputIterator first, InputIterator last) 
{ 
    typedef typename std::iterator_traits<InputIterator>::reference SequenceT; 
     //Problem is next line 
    typedef typename std::iterator_traits<typename SequenceT::iterator>::reference T; 
    for(size_t idx; idx < first->length(); idx++) 
    { 
     T curChar = (*first)[idx]; 
     for (InputIterator cur = first; cur != last; cur++) 
     { 
      if (cur->length() < idx) 
       return idx; 
      if (_tolower(cur->at(idx)) != _tolower(curChar)) 
       return idx; 
     } 
    } 
    return first->length(); 
} 

それを修正する方法についてのアイデアはありますか?エラーは

error C2825: 'SequenceT': must be a class or namespace when followed by '::' 

ありがとうございます。 Billy3

答えて

1

は実際に、それを解決:)

問題SequenceTを参照しないタイプであることです。一般的に参照型のアドレスを取ることはできないので、コンパイラはその参照子のイテレータを生成しません。参照の代わりにvalue_typeを使用する必要があります。

template <typename InputIterator> size_t iLongestBegin(InputIterator first, InputIterator last) 
{ 
    typedef typename std::iterator_traits<InputIterator>::reference SequenceT; 
    typedef typename std::iterator_traits<std::iterator_traits<InputIterator>::value_type::iterator>::reference T; 
    for(size_t idx; idx < first->length(); idx++) 
    { 
     typename T curChar = (*first)[idx]; 
     for (InputIterator cur = first; cur != last; cur++) 
     { 
      if (cur->length() < idx) 
       return idx; 
      if (_tolower(cur->at(idx)) != _tolower(curChar)) 
       return idx; 
     } 
    } 
    return first->length(); 
} 
+1

あなたはまだいくつかのことが間違っています。 "typename T"は "T"でなければならず、 "std :: iterator_traits :: value_type :: iterator"の前に "typename"が必要です。あまりにも怠惰なコンパイラでコンパイルするように見えます。後で別のものとコンパイルしたい場合は、多くの問題が発生します –

+0

今は私を気にしません。コンパイラだけがこれを指し示すのはmsvC++です。ありがとう、結構です :) –

0

テンプレート引数リストにSequenceTと指定していませんでしたか? - それはどこに定義されていますか?あるいは、タイプがtypename SequenceTであることを示す必要があります。

+0

これはエラーとしてフラグが立てられた行の前にあるtypedefです。 –

+0

関数はstd :: list >に渡されます。 –

0

SequenceT::iteratorの代わりにtypename SequenceT::iteratorと書く必要があります。これは、SequenceTがテンプレートパラメータ(標準の「lingo」の「依存型」)から派生した型であり、iteratorが関数または変数ではなくSequenceTの入れ子型であるためです。これらの両方が当てはまる場合、コンパイラは、SequenceT::iteratortypenameの型であることを意味するものと理解することができません。 G ++ 4.4.0と

+0

これを「typedef typename std :: iterator_traits :: reference T;」に変更しました。まだ喜んでいません –

+0

SequenceTはイテレータシーケンス内の要素への参照であるため、ネストされたtypedefはありません。たとえば、InputIteratorがベクトル :: iteratorの場合、SequenceTは「文字列」です。この場合、Tにしたいものを明確にすることはできますか? – Doug

+0

イテレータがstd :: list > –

0

次のコンパイル:

#include <iterator> 
using namespace std; 

template <typename InputIterator> size_t iLongestBegin(InputIterator first, InputIterator last) { 
    typedef typename std::iterator_traits<InputIterator>::reference SequenceT; 
    typedef typename std::iterator_traits<typename SequenceT::iterator>::reference T; 
    for(size_t idx; idx < first->length(); idx++) 
    { 
     T curChar = (*first)[idx]; 
     for (InputIterator cur = first; cur != last; cur++) 
     { 
     if (cur->length() < idx) 
      return idx; 
     if (_tolower(cur->at(idx)) != _tolower(curChar)) 
      return idx; 
     } 
    } 
    return first->length(); 
} 
+0

を指しているので、Tはwchar_tでなければなりません。私が呼び出すまで、Mineもコンパイルされます。あなたはそれにテストデータを投げましたか? –

+0

いいえ。特定のテストデータでのみ実証可能なコードに問題がある場合は、質問にテストコードを含めてください。 –

+0

問題コードがあります。私のコンパイラは型を解決して呼び出さない限り、テンプレート関数をコンパイルしようとしません。 GCCがそのように動作するかどうかは不明です。 –