我有一个模板类,其依赖类型为typedef,用作函数参数:
baseUrl
现在,Visual Studio(2015)和GCC(5)对类template <typename T > struct Foo {
typedef typename std::vector<T>::iterator Iterator;
inline void bar( const Iterator& it ) const;
std::vector<T> vec;
};
之外的函数bar()
的正确声明存在冲突的看法。
我最初是在Linux上编写的,GCC愉快地编译了这个:
Foo
现在尝试在Visual Studio 2015上编译,我收到以下错误消息
template <typename T>
inline void Foo<T>::bar( const Foo<T>::Iterator& it ) const {}
因此,VS似乎要求1>main.cpp(14): error C2065: 'it': undeclared identifier
1>main.cpp(14): warning C4346: 'Foo<T>::Iterator': dependent name is not a type
1> main.cpp(14): note: prefix with 'typename' to indicate a type
关键字出现在typename
前面。精细。我添加了它,但现在它拒绝在GCC中编译。
Iterator
你可以在这里看到http://ideone.com/EaUeus
所以我的问题是......谁是对的?有没有办法让这些代码在两个平台上进行编译,而无需诉诸main.cpp:14:35: error: variable or field 'bar' declared void
inline void Foo<T>::bar( typename const Foo<T>::Iterator& it ) const {}
?
答案 0 :(得分:2)
您应该使用const typename
,而不是typename const
。编译器无法知道Foo<T>::Iterator
是一种类型,而const
只能用于类型。首先要说它是一种类型,然后将其设为const
。