2010-11-11 13 views
7

Mi cerebro se ha derretido debido a varias semanas de días de 14 horas.Constructor de plantillas especializadas de la clase de plantilla

Tengo una clase de plantilla, y estoy tratando de escribir un constructor de conversión de plantilla para esta clase, y especializo ese constructor. El compilador (MSVC9) está bastante disgustado conmigo. Este es un ejemplo mínimo de código real que intento escribir. El error del compilador está en línea con el código.

Ayúdame a unmelt mi cerebro. ¿Cuál es la sintaxis que necesito aquí para hacer lo que estoy tratando de hacer? NOTA: En mi código real, I debe definir el constructor de conversiones fuera de la declaración, por lo que no es una opción para mí.

#include <string> 
#include <sstream> 
using namespace std; 

template<typename A> 
class Gizmo 
{ 
public: 
    Gizmo() : a_() {}; 
    Gizmo(const A& a) : a_(a) {}; 
    template<typename Conv> Gizmo(const Conv& conv) : a_(static_cast<A>(conv)) {}; 

private: 
    A a_; 
}; 

// 
// ERROR HERE: 
// " error C2039: 'Gizmo<B>' : is not a member of 'Gizmo<A>'" 
// 
template<> template<typename B> Gizmo<string>::Gizmo<typename B>(const B& b) 
{ 
    stringstream ss; 
    ss << b; 
    ss >> a_; 
} 

int main() 
{ 
    Gizmo<int> a_int; 
    Gizmo<int> a_int2(123); 
    Gizmo<string> a_f(546.0f); 

    return 0; 
} 
+0

Por el bien de los lectores en el futuro, eliminé el espurio 'typename' en mi problema original. –

Respuesta

7
template<> template<typename B> Gizmo<string>::Gizmo(const B& b) 

También tenga en cuenta que la palabra clave de typenameconst typename B&debe ser eliminado.

+1

No sé cómo está en MSVC, pero 'g ++' no compilará si no es 'const B & b'. – kennytm

+1

¡Mi cerebro les agradece a los dos! Fácil rep, eh? Solo hago preguntas fáciles. :) –

+1

@John: Deberías relajarte un poco el cerebro de vez en cuando. La exposición prolongada a 14 horas al día puede ser perjudicial. –

Cuestiones relacionadas