2010-11-18 4 views
5

Para definir una clase de plantilla, considero tres archivos diferentes. La declaración está en un archivo .h, las implementaciones de métodos están en un archivo .cpp, y se incluyen instancias explícitas en un archivo .inc (agregando una línea al final de .cpp, por ejemplo: #include "bar-impl.inc").devolviendo tipos de plantilla de métodos parametrizados que no son de plantilla

Ahora, aquí está mi problema. Tengo dos clases de plantilla, por ejemplo: Foo<S> y Bar<T>. Dentro de la clase Bar<T>, tengo un método que devuelve un tipo de plantilla FooType* (que con mi instancias explícita Me gustaría que ser, por ejemplo, Foo<float>*)

template<class T> 
class Bar{ 
.... 
template <class FooType> 
FooType* doSomething(int); 
.... 
}; 

Dado que el compilador no sabe qué FooType* es, traté de instanciar explícitamente el método doSomething en el archivo bar-impl.inc.

//bar-impl.inc 
template class Foo<float> * Bar<float>::doSomething(int); 

Sin embargo, no funcionó y me da un error de: no matching function for call to ‘Bar<float>::doSomething(int&)’ make: *** [main] Error 1

¿Alguien sabe si es posible hacer eso?

Respuesta

1

Las plantillas de métodos funcionan exactamente de la misma manera que las plantillas de funciones. Debe crear una instancia explícita sobre el uso a menos que los parámetros de la plantilla puedan derivarse de la llamada.

Así que realmente no necesita para hacer una especialización, lo que tiene que hacer es especificar el FooType en el uso:

Bar<float> somevar; somevar.doSomething< Foo<float> >(somevalue);

Si siempre desea volver Foo<T>* continuación, sólo tiene que utilizar Foo<T>* doSomething(int);

+0

Gracias! pero dado que separé la declaración de la instanciación de la clase de plantilla, necesito en todo caso hacer la instanciación explícita, ¿no? – Javier

+0

@Javier Si coloca el código de su plantilla dentro de los archivos '.cpp', entonces necesita crear una instancia explícita de todas las plantillas, porque el compilador no puede hacer eso por usted. Pero el problema que tienes no está relacionado. Tiene un método con plantilla e intenta llamar a un método que no es de plantilla (que no existe). –

+0

bien, así, que debería tener: plantilla clase bar { .... plantilla Foo * doSomething (int); .... }; ¿es eso lo que estás sugiriendo? Y qué pasa si no me gustaría volver siempre Foo *. Lo siento, estoy un poco confundido. ¿Te importa incluir un ejemplo 'main.cpp' sobre cómo puedo llamar al método doSomething? – Javier

Cuestiones relacionadas