尝试从模板化函数返回向量会引发编译错误。

时间:2012-10-02 01:47:31

标签: c++ templates vector

问题如下:以下测试会引发大量编译器错误。

#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();
}

关于为什么的任何想法?

3 个答案:

答案 0 :(得分:2)

您需要在两个地方添加typename

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

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

通过添加typename,您告诉编译器如何来解析代码。基本上,通过添加typename,您告诉编译器将声明解析为类型。

请阅读Where and why do I have to put the “template” and “typename” keywords?以获得深入的解释。

答案 1 :(得分: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();
}

答案 2 :(得分:-2)

在C ++模板类中,模板成员函数必须在类中定义它们的主体,因为模板参数不存在于类之外。最后两个错误看起来像编译器在不熟悉的上下文导致它错误解释完全有效的语法时产生的错误。尝试在类中移动函数体。