Lego86 (Member)
Rookie
Messaggi: 30
Iscritto: 04/10/2008
|
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++ |
#include "nodo.h" #include "lista.h" #include <iostream> using namespace std; int main(){ lista<int> a; lista<int> b; a.carica(5); a.stampa(); return 0; }
|
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++ |
#ifndef LISTA_H_ #define LISTA_H_ #include "nodo.h" template <class T> class lista{ private: nodo<T>* testa; public: lista(); ~lista(); void carica(int); void stampa(); nodo<T>* concatenate(nodo<T>*,nodo<T>*); }; #endif
|
file lista.cpp
Codice sorgente - presumibilmente C++ |
#include "lista.h" #include "nodo.h" #include <stdlib.h> #include <iostream> using namespace std; template <class T> lista<T>::lista() : testa(0){} template <class T> lista<T>::~lista(){} template <class T> void lista<T>::carica(int numel){ T elemento; nodo<T>* n; n=testa; for(int i;i<numel;i++){ cout<<"Inserire l'elemento "<<i<<" :"; cin>>elemento; n=new nodo<T>; n->elem=elemento; n=n->next; } } template <class T> void lista<T>::stampa(){ nodo<T>* n; n=testa; cout<<"Stampa valori..."<<endl; while((n->next)!=0){ cout<<n->elem<<endl; n=n->next; } } template <class T> nodo<T>* lista<T>::concatenate(nodo<T>* headA,nodo<T>* headB){ nodo<T>* punt, *newPunt; punt=headA; while((punt->getNext())!=(NULL)) punt=punt->getNext(); newPunt=punt->getNext(); newPunt=headB; }
|
Grazie mille per l'aiuto! |
|
carlduke (Member)
Pro
Messaggi: 153
Iscritto: 29/01/2011
|
implementa tutti i metodi template nell'header.
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Non ti si puo' rispondere...
1) Qual'e' il messaggio di errore completo?
2) Quale IDE stai usando? Su che sistema operativo?
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Postato originariamente da carlduke:
implementa tutti i metodi template nell'header. |
Questo e' un workaround piu' che una soluzione...
|
|
carlduke (Member)
Pro
Messaggi: 153
Iscritto: 29/01/2011
|
Postato originariamente da pierotofy:
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 |
|
Lego86 (Member)
Rookie
Messaggi: 30
Iscritto: 04/10/2008
|
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
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Puoi postare una copia del makefile?
|
|
Lego86 (Member)
Rookie
Messaggi: 30
Iscritto: 04/10/2008
|
Eccolo:
Codice sorgente - presumibilmente VB.NET |
################################################################################ # Automatically -generated file. Do not edit! ################################################################################ -include ../makefile.init RM := rm -rf # All of the sources participating in the build are defined here -include sources.mk -include src/subdir.mk -include subdir.mk -include objects.mk ifneq ($(MAKECMDGOALS),clean) ifneq ($(strip $(C++_DEPS)),) -include $(C++_DEPS) endif ifneq ($(strip $(C_DEPS)),) -include $(C_DEPS) endif ifneq ($(strip $(CC_DEPS)),) -include $(CC_DEPS) endif ifneq ($(strip $(CPP_DEPS)),) -include $(CPP_DEPS) endif ifneq ($(strip $(CXX_DEPS)),) -include $(CXX_DEPS) endif ifneq ($(strip $(C_UPPER_DEPS)),) -include $(C_UPPER_DEPS) endif endif -include ../makefile.defs # Add inputs and outputs from these tool invocations to the build variables # All Target all: esame12set # Tool invocations esame12set: $(OBJS) $(USER_OBJS) @echo 'Building target: $@' @echo 'Invoking: GCC C++ Linker' g++ -o "esame12set" $(OBJS) $(USER_OBJS) $(LIBS) @echo 'Finished building target: $@' @echo ' ' # Other Targets clean: -$(RM) $(OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) esame12set -@echo ' ' .PHONY: all clean dependents .SECONDARY: -include ../makefile.targets
|
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
Anche questi per piacere:
-include sources.mk
-include src/subdir.mk
-include subdir.mk
-include objects.mk
|
|
|