依赖类型声明为模板类中的函数参数

时间:2016-02-25 22:33:08

标签: c++ visual-studio templates gcc dependent-type

我有一个模板类,其依赖类型为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 {}

1 个答案:

答案 0 :(得分:2)

您应该使用const typename,而不是typename const。编译器无法知道Foo<T>::Iterator是一种类型,而const只能用于类型。首先要说它是一种类型,然后将其设为const