2012-02-28 8 views
10

Estoy trabajando en una clase XmlWriter, y quería poder mostrar atributos o texto en la mayoría de los formatos de datos estándar (cadenas, enteros, números flotantes, etc.). Para lograr esto, estoy usando una secuencia de archivos.¿Cómo puedo usar la especialización de plantillas en clases de C++ y por qué esto no se compila?

Para el tipo de datos bool, quería especificar una especialización de la plantilla, de forma que produzca true y false en lugar de 1 y 0.

Sin embargo, no parece el siguiente código para compilar:

class XmlWriter { 

private: /* ... */ 

public: /* ... */ 

    template <typename T> 
    void writeText(T text) { 
     /* ... */ 
    } 

    template <> // <-- error: explicit specialization in non-namespace scope 'class Strategy::IO::XmlWriter' 
    void writeText<bool> (bool text) { // <-- error: template-id 'writeText<>' in declaration of primary template 
     /* ... */ 
    } 

    template <typename T> 
    void writeAttribute(std::string key, T value) { // <-- error: too many template-parameter-lists 
     /* ... */ 
    } 

    template <> // <-- error: explicit specialization in non-namespace scope 'class Strategy::IO::XmlWriter' 
    void writeAttribute<bool> (std::string key, bool value) { // <-- error: variable or field 'writeAttribute' declared void; expected ';' before '<' token 
     /* ... */ 
    } 
}; // <-- expected ';' before '}' token 

No entiendo, ¿por qué todos estos errores, ya que utilizamos la sintaxis correcta presentado en varios sitios web en Internet?

Estoy usando Cygwin GCC.

+1

Este compilado bien en VC2010. En lugar de proporcionar especializaciones, puede sobrecargar las funciones: 'void writeText (texto bool);'. – hmjd

+0

Bueno, afaik VC2010 no cumple con los estándares ... el código no se compila en GCC. – Tibi

+0

¿qué versión de gcc? – hmjd

Respuesta

12

explicit specialization in non-namespace scope 'class Strategy::IO::XmlWriter'

¿Intenta mover la especialización al ámbito del espacio de nombres?

class XmlWriter { 

private: /* ... */ 

public: /* ... */ 

    template <typename T> 
    void writeText(T text) { 
    } 


    template <typename T> 
    void writeAttribute(std::string key, T value) { 
    } 


}; 

template <> 
void XmlWriter::writeText<bool> (bool text) { 
} 

template <> 
void XmlWriter::writeAttribute<bool> (std::string key, bool value) { 
} 
+1

Esto no parece compilar, me da errores que ya se ha definido. No estoy seguro de cómo definirlo correctamente en un proyecto de archivos múltiples, probé muchas combinaciones y ninguna parece funcionar. – Tibi

+0

[Funciona para mí] (http://ideone.com/qxXva) con G ++ 4.3.4 –

+0

Editado el^comentario – Tibi

2

Tal vez sea solo por su código de ejemplo simplificado, pero realmente no necesita utilizar la especialización de plantilla para este problema. La sobrecarga de funciones debería hacer bien el trabajo. Por lo que podría volver a escribir el código un poco como esto:

class XmlWriter 
{ 
public: 
    template <typename T> 
    void writeText(T text) { 
     std::cout << "Text: " << text; 
    } 

    void writeText (bool text) { 
     std::cout << "Bool: " << text; 
    } 
}; 
+1

+1: Me gusta su respuesta mejor que la mía. –

6

En lugar de especializada que sólo puede sobrecargar writeText() y writeAttribute():

class XmlWriter { 

private: /* ... */ 

public: /* ... */ 

    template <typename T> 
    void writeText(T text) {} 

    void writeText(bool text) {} 

    template <typename T> 
    void writeAttribute(std::string key, T value) {} 

    void writeAttribute(std::string key, bool value) {} 
}; 

compila con g ++ v4.6.1.

0

Retire la declaración especializada y en la definición hacen en línea:

class XmlWriter { 

private: /* ... */ 

public: /* ... */ 

    template <typename T> 
    void writeText(T text) { 
    } 


    template <typename T> 
    void writeAttribute(std::string key, T value) { 
    } 


}; 

template <> 
inline void XmlWriter::writeText<bool> (bool text) { 
} 

template <> 
inline void XmlWriter::writeAttribute<bool> (std::string key, bool value) { 
} 
Cuestiones relacionadas