webForumDet fria alternativet

Templates i .cpp och .hpp

C/C++

3 svar · 213 visningar · startad av Viktor

Medlem sedan aug. 20021 752 inlägg
Frågan#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

Medlem sedan juni 200010 432 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.

Medlem sedan aug. 20021 752 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

Medlem sedan juni 200010 432 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.

384 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
129 ms — deklarationer (db)
117 ms — hämta statistik (db)
136 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)