elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  (Consulta) Problema con sobrecarga de operadores y plantillas
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: (Consulta) Problema con sobrecarga de operadores y plantillas  (Leído 2,156 veces)
class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
(Consulta) Problema con sobrecarga de operadores y plantillas
« 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...


« Última modificación: 31 Marzo 2016, 22:02 pm por class_OpenGL » En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: (Consulta) Problema con sobrecarga de operadores y plantillas
« Respuesta #1 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.


En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Problema con sobrecarga de operadores y plantillas
« Respuesta #2 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
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: (Consulta) Problema con sobrecarga de operadores y plantillas
« Respuesta #3 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.
En línea

class_OpenGL


Desconectado Desconectado

Mensajes: 437

Si usas Direct3D, no eres mi amigo :P


Ver Perfil
Re: (Consulta) Problema con sobrecarga de operadores y plantillas
« Respuesta #4 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!
En línea

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Ayuda con plantillas y sobrecarga de operadores
Programación C/C++
4rkn63l 2 4,593 Último mensaje 31 Mayo 2011, 21:23 pm
por 4rkn63l
[Duda] Sobrecarga de operadores
Programación C/C++
BlackZeroX 4 2,994 Último mensaje 13 Junio 2011, 20:55 pm
por BlackZeroX
C++ - Sobrecarga de operadores
Programación C/C++
eltongabinghiman 2 2,909 Último mensaje 14 Marzo 2012, 18:14 pm
por x64core
problema con sobrecarga de operadores c++
Programación C/C++
swagger14 1 2,448 Último mensaje 4 Abril 2012, 22:26 pm
por david_BS
Sobrecarga de operadores en C#
.NET (C#, VB.NET, ASP)
DanielPy 3 3,721 Último mensaje 31 Julio 2013, 19:22 pm
por Novlucker
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines