webForumDet fria alternativet

Templates i .cpp och .hpp

3 svar · 213 visningar · startad av Viktor

ViktorMedlem sedan aug. 20021 710 inlägg
#1

Har börjat använda templates igen och nu måste jag få svar på min fråga som jag har haft sedan länge innan jag blir galen.

Hur gör man för att får en template deklaration i en hpp fil och definitionen i cpp filen?? Jag får bara kompilator fel när jag försöker dela upp det på ett snyggt sätt.

Ex

[i]Kalle.hpp[/i]
template <class X>
class Kalle
{
public:
	void swapvals(X &a,X &b)
	{
		X temp;
		temp=a;
		a=b;
		b=temp;
	};
};

Detta fungerar perfekt att använda från en vanlig klass.
När jag gör såhär

[i]Kalle.hpp[/i]
template <class X>
class Kalle
{
public:
	void swapvals(X &a,X &b);
};

[i]Kalle.cpp[/i]
#include "Kalle.hpp"

template <class X>
void Kalle::swapvals(X &a,X &b)
{
	X temp;
	temp=a;
	a=b;
	b=temp;
}

Så fungerar det inte längre, då får jag typ (lite andra filnamn och rader men det är samma kod...)

dcclassics/classics.cpp:60: syntax error before `::' token
dcclassics/classics.cpp:60: `X' was not declared in this scope
dcclassics/classics.cpp:60: `a' was not declared in this scope
dcclassics/classics.cpp:60: `X' was not declared in this scope
dcclassics/classics.cpp:60: `b' was not declared in this scope
dcclassics/classics.cpp:61: ISO C++ forbids declaration of `swapvals' with no
type
dcclassics/classics.cpp:61: initializer list being treated as compound
expression
dcclassics/classics.cpp:61: syntax error before `{' token
dcclassics/classics.cpp:63: ISO C++ forbids declaration of `temp' with no type
dcclassics/classics.cpp:63: `a' was not declared in this scope
dcclassics/classics.cpp:64: ISO C++ forbids declaration of `a' with no type
dcclassics/classics.cpp:64: `b' was not declared in this scope
dcclassics/classics.cpp:65: ISO C++ forbids declaration of `b' with no type
dcclassics/classics.cpp:66: parse error before `}' token

Hur ska man göra eller går det helt enkelt inte att dela upp en template i flera filer??

Kör GCC 3.0.4

/Viktor

PeWMedlem sedan juni 20006 839 inlägg
#2

Det kan skilja på kompilatorerna om det går att dela upp eller ej... och genom att allt måste vara tillgänglig rekommenderas det att lägga både definition och deklaration i headerfilen.

ViktorMedlem sedan aug. 20021 710 inlägg
#3

Lägger in en följdfråga här också,

Min template är en länkadlista och när jag skriver såhär

CMemoryList<char> pMem=new CMemoryList<char>;
pMem->Add("Kalle Anka");
printf("\n%d\n",pMem->GetSize());
printf("\n%s\n",pMem->GetItem(0));
delete pMem;

Så fungerar den bra fram tills delete, då krashar allt.
Men om jag skriver såhär

char *buffer=new char[500];
strcpy(buffer,"Kalle Anka");
CMemoryList<char> pMem=new CMemoryList<char>;
pMem->Add(buffer);
printf("\n%d\n",pMem->GetSize());
printf("\n%s\n",pMem->GetItem(0));
delete pMem;

Så fungerar allt perfekt.
Någon som kan förklara vad det är för skilnad mellan att skapa en sträng och inte delete (deleta den i listan) och att skapa en sträng med "" och deleta den när listan deletas.

/Viktor

PeWMedlem sedan juni 20006 839 inlägg
#4

I de två fallen ovan skulle jag tippa på att det kraschar pga att du genom delete tar bort något som lagras på stacken ("Kalle Anka")... vilket inte sker i den undre kodsnutten.

Genererad på 378 ms · cache AV · v20260730165559-full.f96bc7eb