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

 

 


Tema destacado: Trabajando con las ramas de git (tercera parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Error de simbolo externo sin resolver (MSVS)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Error de simbolo externo sin resolver (MSVS)  (Leído 2,320 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Error de simbolo externo sin resolver (MSVS)
« en: 7 Marzo 2019, 03:54 am »

Hola amigos..

Estoy estudiando templates y no comprendo este comportamiento:

A continuacion la forma en que NO funciona (con esta forma obtengo el error que sale en el titulo)

Código
  1. //Clase.h
  2.  
  3. template <class TM>
  4. class Clase{
  5.  
  6.     TM num1, num2;
  7.  
  8. public:
  9.     Clase(TM n1, TM n2);
  10.     TM ObtenerMultiplicacion() const;
  11.  
  12. };
  13.  


Código
  1. //Clase.cpp
  2.  
  3. #include "Clase.h"
  4.  
  5. template <class TM>
  6. Clase<TM>::Clase(TM n1, TM n2){
  7.     this->num1 = n1;
  8.     this->num2 = n2;
  9. }
  10.  
  11.  
  12. template <class TM>
  13. TM Clase<TM>::ObtenerMultiplicacion() const{
  14.     return this->num1 * this->num2;
  15. }
  16.  


Sin embargo, con esta forma SI que funciona:
Código
  1. //Clase.h
  2.  
  3. template <class TM>
  4. class Clase{
  5.  
  6.     TM num1, num2;
  7.  
  8. public:
  9.     Clase(TM n1, TM n2);
  10.     TM ObtenerMultiplicacion() const;
  11.  
  12. };
  13.  
  14. template <class TM>
  15. Clase<TM>::Clase(TM n1, TM n2){
  16.     this->num1 = n1;
  17.     this->num2 = n2;
  18. }
  19.  
  20.  
  21. template <class TM>
  22. TM Clase<TM>::ObtenerMultiplicacion() const{
  23.     return this->num1 * this->num2;
  24. }
  25.  

Como verán, declarar la clase y definir sus miembros dentro del mismo archivo me funciona, pero si lo separo, no va... y me parece extraño, porque en el archivo Clase.cpp estoy incluyendo la cabecera con #include "Clase.h"

Que ha sucedido??


gracias de antemano.








En línea

Dungeons & dragons;
dragons.Attack();
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Error de simbolo externo sin resolver (MSVS)
« Respuesta #1 en: 7 Marzo 2019, 04:21 am »

Ya entendí, me autorespondo por si alguien mas le interesa la razón..

Pasa que las funciones de clases que usen plantilla son siempre inline, es decir se deben declarar y definir dentro de la clase o al menos en el mismo archivo, creo que a este punto la extensión adecuada del archivo sería .hpp




En línea

Dungeons & dragons;
dragons.Attack();
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Error de simbolo externo sin resolver (MSVS)
« Respuesta #2 en: 7 Marzo 2019, 04:33 am »

Como bien dices tiene que estar todo en el mismo fichero (o al menos que lo parezca). Para estos casos se suele usar la extensión <hpp> pero simplemente para ver más rápidamente a qué está haciendo referencia (pero si se usa <cpp> también funcionaría).
Para no tenerlo todo en el mismo fichero se suele crear la clase en el <clase.h> y las funciones miembro se implementan en <clase.hpp> y se incluye el <clase.hpp> dentro del <clase.h> en vez de al revés. Entonces como en el <main> incluimos <clase.h>, ya estaríamos incluyendo todo.
Código
  1. // clase.h
  2. #ifndef CLASE_H // opcional
  3. #define CLASE_H // opcional
  4. class Clase{
  5.  
  6. };
  7.  
  8. #include "clase.hpp"
  9. #endif // opcional
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Error de simbolo externo sin resolver (MSVS)
« Respuesta #3 en: 7 Marzo 2019, 18:18 pm »

seria como una llamada anidada de archivos.. verdad?

main llama a Clase.h y ésta llama a Clase.hpp ?

Saludos...!"
En línea

Dungeons & dragons;
dragons.Attack();
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Error de simbolo externo sin resolver (MSVS)
« Respuesta #4 en: 7 Marzo 2019, 18:24 pm »

Más o menos eso es.
Cuando haces un <#include fichero> al fin y al cabo es como si pegaras todo el contenido de <fichero> justo en la línea donde está el <include>. Entonces esto te permite implementarlo en distintos ficheros pero para la máquina a la hora de compilar es como si estuviera todo en el mismo. Es una forma de poder mantener la estructura de mantener las implementaciones en un fichero diferente a las declaraciones.
En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Error #1045 que no hay manera de resolver
Bases de Datos
Rykku 1 5,256 Último mensaje 2 Diciembre 2011, 23:23 pm
por Rykku
LINK : error LNK2001: símbolo externo _mainCRTStartup sin resolver
Programación C/C++
wibo99 0 3,405 Último mensaje 11 Enero 2015, 16:28 pm
por wibo99
Mientro static dentro de clase static, simbolo externo sin resolver
Programación C/C++
patilanz 3 3,290 Último mensaje 8 Septiembre 2016, 16:15 pm
por ivancea96
Como resolver este error
Programación C/C++
Borito30 1 2,278 Último mensaje 2 Marzo 2017, 08:53 am
por ivancea96
Pasar argumentos a WinMain
Programación C/C++
Borito30 2 2,117 Último mensaje 26 Marzo 2017, 20:59 pm
por fary
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines