вложенное имя спецификатор - PullRequest
16 голосов
/ 27 июня 2011

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

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’

что я делаю не так?

Ответы [ 3 ]

22 голосов
/ 27 июня 2011

typename там не нужен, и поэтому не допускается.

MSVC не выполняет синтаксический анализ шаблонов до тех пор, пока они не будут фактически использованы, поэтому некоторые ошибки не обнаруживаются до более позднего периода.

6 голосов
/ 27 июня 2011

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

4 голосов
/ 27 июня 2011
typedef pair<const unsigned int, Key> /*typename*/ _myPair;
                                      ^^^^^^^^^^^^ not needed

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...