1

問題は次のとおりです。次のテストでは、大量のコンパイラ エラーがスローされます。

#include <vector>
using namespace std;

template<class T>
class test{
   vector<T> vec;
public:
   vector<T>::iterator begin();

};

template<class T>
vector<T>::iterator test<T>::begin(){
  return vec.begin();
}

int main(){

  test<float> testing;
  testing.begin();

}

いくつかのコンパイラ エラー:

 test.cpp(8): warning C4346: 'std::vector<T>::iterator' : dependent name is not a type
 test.cpp(8): error C2146: syntax error : missing ';' before identifier 'begin'
 test.cpp(13): error C2143: syntax error : missing ';' before 'test<T>::begin'

vector<T>ただし、たとえばテンプレート化されたものを交換すると、vector<float> 問題なくコンパイルされます。例えば:

template<class T>
class test{
   vector<T> vec;
public:
   vector<float>::iterator begin();

};

template<class T>
vector<float>::iterator test<T>::begin(){
   return vec.begin();
}

理由についてのアイデアはありますか?

4

3 に答える 3

2

typename次の2つの場所に追加する必要があります。

typename vector<T>::iterator begin();

typename vector<T>::iterator test<T>::begin()

を追加することで、コードの解析方法typenameをコンパイラーに指示します。基本的に、を追加することにより、宣言を型として解析するようにコンパイラーに指示します。typename

「template」および「typename」キーワードをどこに、なぜ配置する必要があるのか​​をお読みください。詳細な説明については。

于 2012-10-02T01:54:57.840 に答える
1

typenameキーワードを使用しvector<T>::iteratorて、スコープデータや関数メンバーではなく、スコープタイプを参照していることを区別する必要があります。

template<class T>
class test{
   vector<T> vec;
public:
   typename vector<T>::iterator begin();

};

template<class T>
typename vector<T>::iterator test<T>::begin(){
  return vec.begin();
}
于 2012-10-02T01:53:30.267 に答える
-2

C ++テンプレートクラスでは、テンプレートパラメータはクラスの外部に存在しないため、テンプレートメンバー関数の本体はクラス内で定義する必要があります。最後の2つのエラーは、見慣れないコンテキストによってコンパイラが完全に有効な構文を誤って解釈した場合にコンパイラが生成するエラーのように見えます。クラス内で関数本体を移動してみてください。

于 2012-10-02T01:54:28.853 に答える