Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Undefined reference to... perché?
Forum - C/C++ - Undefined reference to... perché?

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Lego86 (Member)
Rookie


Messaggi: 30
Iscritto: 04/10/2008

Segnala al moderatore
Postato alle 12:03
Domenica, 30/09/2012
Ciao a tutti,

sto cercando di creare due template di classe e di inizializzarli in un file main:

File main.cpp:
Codice sorgente - presumibilmente C++

  1. #include "nodo.h"
  2. #include "lista.h"
  3. #include <iostream>
  4. using namespace std;
  5.  
  6. int main(){
  7.         lista<int> a;
  8.         lista<int> b;
  9.         a.carica(5);
  10.         a.stampa();
  11.         return 0;
  12. }



Probabilmente sarà una cavolata, ma il linker non trova nessun metodo della classe lista (nè il costruttore, nè carica, nè stampa). Tuttavia, in fase di editing è l'IDE stesso a suggerirmi quali metodi posso usare, il che mi fa pensare che le intestazioni siano corrette :S

File lista.h:
Codice sorgente - presumibilmente C++

  1. #ifndef LISTA_H_
  2. #define LISTA_H_
  3. #include "nodo.h"
  4.  
  5. template <class T>
  6. class lista{
  7. private:
  8.         nodo<T>* testa;
  9. public:
  10.         lista();
  11.         ~lista();
  12.         void carica(int);
  13.         void stampa();
  14.         nodo<T>* concatenate(nodo<T>*,nodo<T>*);
  15.  
  16.  
  17. };
  18.  
  19. #endif



file lista.cpp
Codice sorgente - presumibilmente C++

  1. #include "lista.h"
  2. #include "nodo.h"
  3. #include <stdlib.h>
  4. #include <iostream>
  5. using namespace std;
  6.  
  7.  
  8. template <class T>
  9. lista<T>::lista() : testa(0){}
  10.  
  11. template <class T>
  12. lista<T>::~lista(){}
  13.  
  14. template <class T>
  15. void lista<T>::carica(int numel){
  16.         T elemento;
  17.         nodo<T>* n;
  18.         n=testa;
  19.         for(int i;i<numel;i++){
  20.                 cout<<"Inserire l'elemento "<<i<<" :";
  21.                 cin>>elemento;
  22.                 n=new nodo<T>;
  23.                 n->elem=elemento;
  24.                 n=n->next;
  25.         }
  26.  
  27. }
  28. template <class T>
  29. void lista<T>::stampa(){
  30.         nodo<T>* n;
  31.         n=testa;
  32.         cout<<"Stampa valori..."<<endl;
  33.         while((n->next)!=0){
  34.                 cout<<n->elem<<endl;
  35.                 n=n->next;
  36.         }
  37. }
  38.  
  39. template <class T>
  40. nodo<T>* lista<T>::concatenate(nodo<T>* headA,nodo<T>* headB){
  41.         nodo<T>* punt, *newPunt;
  42.         punt=headA;
  43.         while((punt->getNext())!=(NULL))
  44.                 punt=punt->getNext();
  45.         newPunt=punt->getNext();
  46.         newPunt=headB;
  47.  
  48. }



Grazie mille per l'aiuto!

PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 14:32
Domenica, 30/09/2012
implementa tutti i metodi template nell'header. :k:

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 23:14
Domenica, 30/09/2012
Non ti si puo' rispondere...

1) Qual'e' il messaggio di errore completo?
2) Quale IDE stai usando? Su che sistema operativo?


Il mio blog: https://piero.dev
PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 23:15
Domenica, 30/09/2012
Testo quotato

Postato originariamente da carlduke:

implementa tutti i metodi template nell'header.



Questo e' un workaround piu' che una soluzione...


Il mio blog: https://piero.dev
PM Quote
Avatar
carlduke (Member)
Pro


Messaggi: 153
Iscritto: 29/01/2011

Segnala al moderatore
Postato alle 10:19
Lunedì, 01/10/2012
Testo quotato

Postato originariamente da pierotofy:

Testo quotato

Postato originariamente da carlduke:

implementa tutti i metodi template nell'header.



Questo e' un workaround piu' che una soluzione...



si esatto ma mi sembra che sia l'unico modo, se c'é un'altra soluzione sono contento di impararla :k:

PM Quote
Avatar
Lego86 (Member)
Rookie


Messaggi: 30
Iscritto: 04/10/2008

Segnala al moderatore
Postato alle 22:33
Lunedì, 01/10/2012
L'IDE che sto usando è Eclipse su linux.
Questi sono gli errori che trovo nel main:

Description    Resource    Location    Path    Type
make: *** [esame12set] Error 1    esame12set             C/C++ Problem
undefined reference to `lista<int>::~lista()'    main.cpp    line 11    /esame12set/src    C/C++ Problem
undefined reference to `lista<int>::carica(int)'    main.cpp    line 9    /esame12set/src    C/C++ Problem
undefined reference to `lista<int>::lista()'    main.cpp    line 7    /esame12set/src    C/C++ Problem
undefined reference to `lista<int>::lista()'    main.cpp    line 8    /esame12set/src    C/C++ Problem
undefined reference to `lista<int>::stampa()'    main.cpp    line 10    /esame12set/src    C/C++ Problem

effettivamente mettendo tutto nell'header sembra che funzioni, anche Googlando un po' il problema questa è la soluzione più comune.
Però vorrei capire se esistesse un modo per tenere separate interfaccia ed implementazione... grazie a tutti per l'aiuto :)

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 23:48
Lunedì, 01/10/2012
Puoi postare una copia del makefile?


Il mio blog: https://piero.dev
PM Quote
Avatar
Lego86 (Member)
Rookie


Messaggi: 30
Iscritto: 04/10/2008

Segnala al moderatore
Postato alle 15:23
Martedì, 02/10/2012
Eccolo:
Codice sorgente - presumibilmente VB.NET

  1. ################################################################################
  2. # Automatically-generated file. Do not edit!
  3. ################################################################################
  4.  
  5. -include ../makefile.init
  6.  
  7. RM := rm -rf
  8.  
  9. # All of the sources participating in the build are defined here
  10. -include sources.mk
  11. -include src/subdir.mk
  12. -include subdir.mk
  13. -include objects.mk
  14.  
  15. ifneq ($(MAKECMDGOALS),clean)
  16. ifneq ($(strip $(C++_DEPS)),)
  17. -include $(C++_DEPS)
  18. endif
  19. ifneq ($(strip $(C_DEPS)),)
  20. -include $(C_DEPS)
  21. endif
  22. ifneq ($(strip $(CC_DEPS)),)
  23. -include $(CC_DEPS)
  24. endif
  25. ifneq ($(strip $(CPP_DEPS)),)
  26. -include $(CPP_DEPS)
  27. endif
  28. ifneq ($(strip $(CXX_DEPS)),)
  29. -include $(CXX_DEPS)
  30. endif
  31. ifneq ($(strip $(C_UPPER_DEPS)),)
  32. -include $(C_UPPER_DEPS)
  33. endif
  34. endif
  35.  
  36. -include ../makefile.defs
  37.  
  38. # Add inputs and outputs from these tool invocations to the build variables
  39.  
  40. # All Target
  41. all: esame12set
  42.  
  43. # Tool invocations
  44. esame12set: $(OBJS) $(USER_OBJS)
  45.         @echo 'Building target: $@'
  46.         @echo 'Invoking: GCC C++ Linker'
  47.         g++  -o "esame12set" $(OBJS) $(USER_OBJS) $(LIBS)
  48.         @echo 'Finished building target: $@'
  49.         @echo ' '
  50.  
  51. # Other Targets
  52. clean:
  53.         -$(RM) $(OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) esame12set
  54.         -@echo ' '
  55.  
  56. .PHONY: all clean dependents
  57. .SECONDARY:
  58.  
  59. -include ../makefile.targets


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 16:04
Martedì, 02/10/2012
Anche questi per piacere:

Testo quotato


-include sources.mk
-include src/subdir.mk
-include subdir.mk
-include objects.mk



Il mio blog: https://piero.dev
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo