web-dev-qa-db-fra.com

spécificateur de nom imbriqué

J'ai un code comme:

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;
    }
}

Il se compile avec succès (et fonctionne) sous MSVC, mais gcc se plaint de la syntaxe invalide:

.hpp:20: error: expected nested-name-specifier before ‘_myPair’
.hpp:20: error: two or more data types in declaration of ‘_myPair’

qu'est-ce que je fais mal?

18
akashihi

Le typename n'y est pas nécessaire et n'est donc pas autorisé.

MSVC n'analyse pas correctement les modèles tant qu'ils ne sont pas réellement utilisés, donc certaines erreurs ne sont trouvées que plus tard.

25
Bo Persson

"attendue nom-imbriqué-spécificateur" signifie qu'après typename mot-clé, vous êtes censé utiliser un nom imbriqué d'un paramètre de modèle, par exemple typedef typename Key::iterator .... Dans votre cas, vous n'avez pas besoin d'utiliser typename.

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

Voir sortie gcc-4.5 ici . (cela vaut pour myownmap étant class ou une fonction)

4
iammilind