在模板中将依赖类型声明为函数参数 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.