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?
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.
"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
.
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)