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>say,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在两个地方添加:

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

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

通过添加typename,您是在告诉编译器如何解析代码。基本上,通过添加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++ 模板类中,模板成员函数的主体必须在类内部定义,因为模板参数不存在于类外部。最后两个错误看起来像编译器在不熟悉的上下文导致它误解完全有效的语法时产生的错误。尝试在类内移动函数体。

于 2012-10-02T01:54:28.853 回答