2011-06-27 21 views
11

que tiene un código como:anidada-nombre-especificador

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

Se compila correctamente (y obras) bajo MSVC, pero gcc se queja de sintaxis no válida:

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

lo que estoy haciendo mal?

+2

¿realmente has probado ESTE código con gcc? le falta una clase/estructura antes de myownmap y "entriesPair" no aparece en ningún lugar de su fragmento. – Philipp

+0

¿Puede mostrarnos la definición de 'entriesPair'? –

+0

¿Qué es 'myownmap'? ¿es una función o clase? – iammilind

Respuesta

16

El typename no es necesario allí, y por lo tanto no está permitido.

MSVC no analiza las plantillas correctamente hasta que realmente se utilizan, por lo que algunos errores no se encuentran hasta más adelante.

3

"especificador de nombre anidado esperado" significa que después de la palabra clave typename se espera que utilice un nombre anidado de un parámetro de plantilla, por ejemplo typedef typename Key::iterator .... En su caso, no tiene que usar typename.

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

Ver el gcc-4.5 output here. (es válido para myownmap siendo class o función)