Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: class_OpenGL en 31 Marzo 2016, 20:50 pm



Título: (Consulta) Problema con sobrecarga de operadores y plantillas
Publicado por: class_OpenGL en 31 Marzo 2016, 20:50 pm
Introducción (se puede saltar): Hola, muy buenas. En mi afán por hacer una consola (no es por reinventar la rueda, es cosa de practicar :D) decidí hacerla usando OpenGL (suena raro, pero lo estoy consiguiendo XD).

____
El problema con el que me he topado es a la hora de sobrecargar el operador <<. Para sobrecargarlo, he hecho lo siguiente:

screen.h
Código
  1. class ConsoleScreen {
  2.    public:
  3.        // Algunos métodos...
  4.  
  5.        template <class T>
  6.        ConsoleScreen& operator<<(T value); // Prototipo del operador
  7.  
  8.    private:
  9.        // Varias variables...
  10.  
  11.        std::ostringstream m_cOutput;
  12.  
  13.        // Y más variables...
  14. }

screen.cpp
Código
  1. // Definición de los métodos...
  2.  
  3. template <class T>
  4. ConsoleScreen& ConsoleScreen::operator<<(T value) { // Aquí defino el operador
  5.    m_cOutput << value;
  6.    return *this;
  7. }

main.cpp
Código
  1. int main() {
  2.    // Inicialización de la consola, prueba de métodos...
  3.  
  4.    cConsole << "Checking operator\n"; // Aquí marca el error
  5.  
  6.    // Destrucción de la consola...
  7.    return 0;
  8. }

El error que aparece en la linea que he marcado es el siguiente:
Código:
||=== Build: Release in Texto (compiler: GNU GCC Compiler (x64)) ===|
obj\Release\main.o:main.cpp:(.text.startup+0x13c)||undefined reference to `ConsoleScreen& ConsoleScreen::operator<< <char const*>(char const*)'|
||error: ld returned 1 exit status|
||=== Build failed: 2 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

Como ven, me aparece que no he definido la sobrecarga del operador (cuando se ve claramente que si). El error solo me aparece con el operador, no con los métodos. He probado a cambiar (dentro de template) 'class' por typename, pero me dice lo mismo.

Para probar también, he definido el operador simplemente con un const char*, y en ese caso si que ha funcionado:
Código
  1. ConsoleScreen& ConsoleScreen::operator<<(const char* value) { // Aquí defino el operador
  2.    m_cOutput << value;
  3.    return *this;
  4. }

Mi duda es: ¿Por qué me salta el error cuando uso plantillas?



Siento si la pregunta se hace larga de leer, pero no sé como podría resumirla más sin dar los datos que creo que son necesarios...


Título: Re: (Consulta) Problema con sobrecarga de operadores y plantillas
Publicado por: ivancea96 en 1 Abril 2016, 13:21 pm
No se compilan todas las posibilidades de uina plantilla. Solo se compilanm las que se están utilizando. Cuando compilas el screen.cpp, solo se compilan las posibilidades que hayas usado en esa compilación, no las del main.

Mejor usar sobrecarga.


Título: Re: (Consulta) Problema con sobrecarga de operadores y plantillas
Publicado por: class_OpenGL en 1 Abril 2016, 14:03 pm
Entonces, las plantillas solo se pueden usar en un mismo .cpp. ¿no? Una pena... A sobrecargar!!... Muchas gracias por la respuesta


Título: Re: (Consulta) Problema con sobrecarga de operadores y plantillas
Publicado por: ivancea96 en 1 Abril 2016, 15:18 pm
Si en verdad necesitases una plantilla, puedes forzar el uso de determinados tipos con una función sin uso como:
Código
  1. void abcdef(){
  2.    ConsoleScreen() << (int)0 << (short)0 << (char*)nullptr << (void*)nullptr << (string)*(string*)nullptr;
  3. }
  4.  

Aunque es sin duda un método bastante indeseable.


Título: Re: (Consulta) Problema con sobrecarga de operadores y plantillas
Publicado por: class_OpenGL en 1 Abril 2016, 18:05 pm
No, solo quería la plantilla para no tener que sobrecargar tanto, pero sin duda la sobrecarga es mejor XD Gracias!