Intressant... Nu får jag istället "undefined reference" på konstruktorn till LinkedList. Den är ju deklarerad i Stack.h. Varför är det bara konstruktorerna som krånglar? Jag måste ha missat något... Någon idé?
Har nog med vilken ordning kompilatorn klipper och klistrar in saker att göra. Hade kanske funkat annorlunda med nån mer flagga ( ex: -w?) till g++, med avseende på länkningen.
Har provat att änvända -w men det gör ingen egentlig skillnad. Förstår inte varför det ska vara så svårt att få ihop ett så simpelt program... Jag lägger upp koden också ifall någon orkar titta på den. Den innehåller nog en del fel, slängde bara ihop lite snabbt.
Som sagt så har det med hur kompilatorn klipper och klistrar in kod, att göra. Du kan endera slopa Stack.cpp, LinkedList.cpp och Node.cpp och peta in koden från dessa sist i respektive h-fil. Eller så kan du lägga in ett
#include "XXX.cpp"
innan #endif i respektive (XXX)-header.
XXX motsvarar Stack, LinkedList eller Node - som du kanske förstår ;)
Gör du detta försvinner länkstrulet, men du har lite fler fel att fixa innan progget är funktionsdugligt :)
Det kan hända att det finns bättre sätt att hantera detta med länkningen på, dock.
Btw... du behöver inte ange alla .cpp filerna när du kompilerar (kommandoraden eller i makefile), det blir så automagiskt iom att du kör includes på headerna i din lab2.cpp och att du har ett 'straight forward' beroende.
Problemet löste sig aldrig riktigt, men jag hann inte undersöka det närmare. Nu testade jag igen med ett enkelt litet program. Koden:
Node.h
#ifndef NODE_H
#define NODE_H
template <class T> class Node {
private:
T data;
public:
Node(T);
T getData();
};
#endif
Node.cpp
#include "Node.h"
#include <iostream>
using namespace std;
template <class T> Node<T>::Node(T d)
{
data = d;
}
template <class T> T Node<T>::getData()
{
return data;
}
int main()
{
Node<int> node(5);
cout << node.getData() << endl;
return 0;
}
Det här fungerar bra. Problemet uppstår när man vill använda Node ifrån något annat ställe. T ex:
Test.cpp
#include "Node.h"
#include <iostream>
using namespace std;
int main()
{
Node<int> node(5);
cout << node.getData() << endl;
return 0;
}
När man försöker kompilera det (g++ -o Test Test.cpp Node.cpp) får man felet: C:\DOCUME~1\Admin\LOCALS~1\Temp/ccsZbaaa.o(.text+0x28):Test.cpp: undefined reference to `Node<int>::Node(int)'
C:\DOCUME~1\Admin\LOCALS~1\Temp/ccsZbaaa.o(.text+0x42):Test.cpp: undefined reference to `Node<int>::getData()'
Om man vill dela upp en mallbaserad (med template<>) klass i en .h och en .cpp-fil måste man använda det reserverade ordet 'export'.
foo.h:
export template<typename T> int foo();
foo.cpp:
template<typename T>
int foo()
{
return sizeof T;
}
så kommer det att fungera.
Dessvärre stödjer nästan inga kompilatorer detta idag (jag vet bara en och det är ej den du använder) så du får snällt låta bli att dela upp dina mallbaserade funktioner i två filer.