2010-10-05 11 views
7

Estoy tratando de averiguar la forma correcta de inicializar una variable de contenedor estático cuyo valor de plantilla es una clase interna privada. Aquí hay un ejemplo de juguete¿Cómo se inicializa un contenedor con plantilla estática?

#include <vector> 

using namespace std; 

template <class myType> 
class Foo { 
private: 
    class Bar { 
     int x; 
    }; 

    static vector<Bar*> bars; 
}; 

template <class myType> 
vector<Bar*> Foo<myType>::bars; // error C2065: 'Bar' : undeclared identifier 

También he intentado

... 

template <class myType> 
vector<Foo<myType>::Bar*> Foo<myType>::bars; // error C2059: syntax error : '>' 

Funciona si class Bar es declarado fuera de class Foo pero desde el punto de vista de diseño se trata de una solución fea. ¿Alguna sugerencia?

FYI, todo se declara en un archivo .h.

Respuesta

10

Prueba esto:

template <class myType> 
vector<typename Foo<myType>::Bar*> Foo<myType>::bars; 
+0

me ganó por 4secs! ': + 1' de mi parte – sbi

+0

siempre me golpearon por un margen grande. :( – Donotalo

+2

Sí, páseme también. La regla es, use la palabra clave 'typename' antes de A :: B cuando se supone que es un tipo y la expresión A implica un parámetro de plantilla. – aschepler

-1

vector<Foo::Bar*> Foo<myType>::bars; ... nota de la Foo::

+0

-1? ... por favor, enséñame. – dgnorton

+0

@dgnorton: ¿Has intentado compilarlo? Falla en 'gcc'. 'Foo' necesita ser calificado con el parámetro tipo entre otras cosas. –

+0

@Richard, en VS 2008 sí (sin advertencias) ... en mi camino a compilar en gcc – dgnorton

Cuestiones relacionadas