---
title: "Templates i .cpp och .hpp"
type: "forum-thread"
url: "https://www.webforum.nu/amne/c-cpp/63589-templates-i-cpp-och-hpp"
topic: "C/C++"
topic_url: "https://www.webforum.nu/amne/c-cpp"
author: "Viktor"
published: "2003-01-01T23:23:15.000Z"
updated: "2003-01-02T18:54:11.000Z"
replies: 3
views: 227
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/c-cpp/63589-templates-i-cpp-och-hpp"
---

# Templates i .cpp och .hpp

## #1 — Viktor, 2003-01-01T23:23Z

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

Permalänk: https://www.webforum.nu/p/63589

## #2 — PeW, 2003-01-02T08:09Z

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.

Permalänk: https://www.webforum.nu/p/900879

## #3 — Viktor, 2003-01-02T14:12Z

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

Permalänk: https://www.webforum.nu/p/901014

## #4 — PeW, 2003-01-02T18:54Z

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.

Permalänk: https://www.webforum.nu/p/901169

---

Tråden på webben: https://www.webforum.nu/amne/c-cpp/63589-templates-i-cpp-och-hpp
