2016-02-25 2 views
2

У меня есть класс шаблона, который имеет зависимые типы как определения типов, используемые в качестве параметров функции:Декларации зависимого типа в качестве параметра функции в шаблонном классе

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?

ответ

2

Вы должны использовать const typename, а не typename const. Компилятор не может знать, что Foo<T>::Iterator является типом, а const может использоваться только для типов. Поэтому сначала скажите, что это тип, а затем сделайте это const.

+0

Ах, человек, о котором я должен был подумать, вы были правы. Хороший улов. – Louen