在模板中将依赖类型声明为函数参数 class
Declaration of dependent type as function parameter in template class
我有一个模板 class,它具有用作函数参数的依赖类型作为 typedef:
template <typename T > struct Foo {
typedef typename std::vector<T>::iterator Iterator;
inline void bar( const Iterator& it ) const;
std::vector<T> vec;
};
现在,Visual Studio (2015) 和 GCC (5) 对于在 class Foo
.[=21 之外正确声明函数 bar()
的观点存在冲突=]
原来在Linux上是这样写的,GCC编译的很开心:
template <typename T>
inline void Foo<T>::bar( const Foo<T>::Iterator& it ) const {}
现在尝试在 Visual Studio 2015 上编译,我收到以下错误消息
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
看来 VS 要求 typename
关键字出现在 Iterator
前面。美好的。我添加了它,但现在它拒绝在 GCC 中编译。
main.cpp:14:35: error: variable or field 'bar' declared void
inline void Foo<T>::bar( typename const Foo<T>::Iterator& it ) const {}
你可以在这里看到直播http://ideone.com/EaUeus
所以我的问题是...谁是对的?有没有办法让这段代码在不求助于 #ifdef
的情况下跨两个平台编译?
您应该使用 const typename
,而不是 typename const
。编译器无法知道 Foo<T>::Iterator
是一种类型,而 const
只能用于类型。所以先说它是一个类型,然后再做成const
.
我有一个模板 class,它具有用作函数参数的依赖类型作为 typedef:
template <typename T > struct Foo {
typedef typename std::vector<T>::iterator Iterator;
inline void bar( const Iterator& it ) const;
std::vector<T> vec;
};
现在,Visual Studio (2015) 和 GCC (5) 对于在 class Foo
.[=21 之外正确声明函数 bar()
的观点存在冲突=]
原来在Linux上是这样写的,GCC编译的很开心:
template <typename T>
inline void Foo<T>::bar( const Foo<T>::Iterator& it ) const {}
现在尝试在 Visual Studio 2015 上编译,我收到以下错误消息
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
看来 VS 要求 typename
关键字出现在 Iterator
前面。美好的。我添加了它,但现在它拒绝在 GCC 中编译。
main.cpp:14:35: error: variable or field 'bar' declared void
inline void Foo<T>::bar( typename const Foo<T>::Iterator& it ) const {}
你可以在这里看到直播http://ideone.com/EaUeus
所以我的问题是...谁是对的?有没有办法让这段代码在不求助于 #ifdef
的情况下跨两个平台编译?
您应该使用 const typename
,而不是 typename const
。编译器无法知道 Foo<T>::Iterator
是一种类型,而 const
只能用于类型。所以先说它是一个类型,然后再做成const
.