Ответ 1
typename
там не нужен и поэтому не разрешен.
MSVC правильно не анализирует шаблоны, пока они не будут использованы, поэтому некоторые ошибки не будут найдены до конца.
У меня есть код вроде:
namespace mymap {
template <class Key,template <typename T > class Allocator> myownmap {
typedef pair<const unsigned int, Key> typename _myPair;
typedef multimap<unsigned int, Key,less<Key> ,Allocator<_myPair> > typename _entriesType;
}
}
Он успешно компилируется (и работает) под MSVC, но gcc жалуется на недопустимый синтаксис:
.hpp:20: error: expected nested-name-specifier before ‘_myPair’
.hpp:20: error: two or more data types in declaration of ‘_myPair’
что я делаю неправильно?
typename
там не нужен и поэтому не разрешен.
MSVC правильно не анализирует шаблоны, пока они не будут использованы, поэтому некоторые ошибки не будут найдены до конца.
typedef pair<const unsigned int, Key> /*typename*/ _myPair;
^^^^^^^^^^^^ not needed
Смотрите вывод gcc-4.5 здесь. (верно для myownmap
, являющегося class
или функцией)
"ожидаемый вложенный имя-спецификатор" означает, что после typename
ключевого слова вы должны использовать некоторое вложенное имя параметра шаблона, например typedef typename Key::iterator ...
. В вашем случае вам не нужно использовать typename
.