学术问题:typename

时间:2010-06-11 05:42:33

标签: c++ templates g++ typename

  

可能重复:
  Why do I need to use typedef typename in g++ but not VS?

嗨,最近我解释了将代码从VC ++移植到gcc / intel的“简单问题”。 代码在VC ++上编译没有错误:

#include <vector>
using std::vector;

template <class T> 
void test_vec( std::vector<T> &vec) 
{ 
        typedef std::vector<T> M; 
/*==> add here  typename*/  M::iterator  ib=vec.begin(),ie=vec.end();
};
int main()
{
     vector<double> x(100, 10);
     test_vec<double>(x); 
     return 0;
}

然后使用g ++我们有一些不明确的错误:

 g++ t.cpp
t.cpp: In function 'void test_vec(std::vector<T, std::allocator<_CharT> >&)':
t.cpp:13: error: expected `;' before 'ie'
t.cpp: In function 'void test_vec(std::vector<T, std::allocator<_CharT> >&) [with T = double]':
t.cpp:18:   instantiated from here
t.cpp:12: error: dependent-name 'std::M::iterator' is parsed as a non-type, but instantiation yields a type
t.cpp:12: note: say 'typename std::M::iterator' if a type is meant

如果我们在迭代器之前添加 typename ,代码将编译w / o pb。

如果有可能使编译器能够理解以更“自然的方式”编写的代码,那么对我来说还不清楚为什么要添加typename?如果我们允许所有编译器在没有“typename”的情况下使用,那么“C ++标准”的规则(如果有的话)会被破坏?

亲切的问候 阿尔曼。

2 个答案:

答案 0 :(得分:2)

此处is a page解释了typename

答案 1 :(得分:1)