Reputation: 910
I wrote a template class which extends STL list for some use. I declare this class in a header file and define it in a cpp file. However, when I tried to test it in another cpp file, I found Visual Studio not able to link the functions to the cpp file.
I know I can solve this problem by just including the cpp file, but I wonder if there is another way, a better way?
In case you require further information of my code, I give my template class header file "KA_Buffer.h" and main program "main.cpp" below.
KA_Buffer.h:
#pragma once
#include <list>
typedef int KA_Time;
typedef std::list<KA_Time> KA_TimeList;
/**
* This is a length-limited buffer which would only save limited number of
* elements.
*/
template <class T>
class KA_Buffer :
public std::list<T>
{
public:
KA_Buffer(int length) :
m_MaxLength(length), m_Length(0) {};
~KA_Buffer(void) {};
void add(T);
void pop_front();
iterator find(T);
private:
int m_Length;
int m_MaxLength;
};
main.cpp:
#include <iostream>
#include <Windows.h>
#include "KA_Buffer.h"
int main()
{
KA_Buffer<int> buffer(5);
for (int i = 0; i < 10; i++)
{
buffer.add(i);
for (KA_Buffer<int>::iterator iter = buffer.begin();
iter != buffer.end(); iter++)
{
std::cout<<*iter<<" ";
}
std::cout<<std::endl;
}
system("pause");
return 0;
}
The error messages:
1>main.obj : error LNK2019: unresolved external symbol "public: void __thiscall KA_Buffer::add(int)" (?add@?$KA_Buffer@H@@QAEXH@Z) referenced in function _main
Upvotes: 0
Views: 1021
Reputation: 258618
Template method definitions need to be present in the header file.
template <class T>
class KA_Buffer :
public std::list<T>
{
public:
KA_Buffer(int length) :
m_MaxLength(length), m_Length(0) {};
~KA_Buffer(void) {};
void add(T) // <--- add method definition here
{
}
void pop_front() //<--- add method definition here
{
}
iterator find(T) //<--- add method definition here
{
}
private:
int m_Length;
int m_MaxLength;
};
They don't have to be present in the function declaration, you can also define the methods outside, as long as you keep them visible to the translation unit using the template:
template <class T>
class KA_Buffer :
public std::list<T>
{
public:
KA_Buffer(int length) :
m_MaxLength(length), m_Length(0) {};
~KA_Buffer(void) {};
void add(T);
void pop_front();
iterator find(T);
private:
int m_Length;
int m_MaxLength;
};
// Definitions follow in the header file:
template <class T>
void KA_Buffer::add(T)
{
}
template <class T>
void KA_Buffer::pop_front()
{
}
template <class T>
iterator KA_Buffer::find(T)
{
}
Upvotes: 2