Вложенное имя спецификатор

У меня есть код вроде:

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’

что я делаю неправильно?

Ответ 1

typename там не нужен и поэтому не разрешен.

MSVC правильно не анализирует шаблоны, пока они не будут использованы, поэтому некоторые ошибки не будут найдены до конца.

Ответ 2

typedef pair<const unsigned int, Key> /*typename*/ _myPair;
                                      ^^^^^^^^^^^^ not needed

Смотрите вывод gcc-4.5 здесь. (верно для myownmap, являющегося class или функцией)

Ответ 3

"ожидаемый вложенный имя-спецификатор" означает, что после typename ключевого слова вы должны использовать некоторое вложенное имя параметра шаблона, например typedef typename Key::iterator .... В вашем случае вам не нужно использовать typename.