У меня есть класс шаблона, который имеет зависимые типы как определения типов, используемые в качестве параметров функции:Декларации зависимого типа в качестве параметра функции в шаблонном классе
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) имеет конфликтующий представления по правильному объявлению функции bar()
вне класса Foo
.
Я originately написал, как это на 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
?
Ах, человек, о котором я должен был подумать, вы были правы. Хороший улов. – Louen