//queue.h
template <class Type>
class TQueue
{
public:
TQueue(){}
~TQueue(){}
void add(const Type& queueItem);
...
};
//queue.cpp
#include "queue.h"
template <class T>
void TQueue<T>::add(const T& queueItem)
{
...
}
//main.cpp
#include "queue.h"
int main(int argc, char* argv[])
{
TQueue<int>* p = new TQueue<int>();
p->add( 2 );
delete p;
return 0;
}
感觉很正常的使用啊, 但编译时却出现如下错误:
Linking...
q.obj : error LNK2001: unresolved external symbol "public: void __thiscall TQueue<int>::add(int const &)" (?add@?$TQueue@H@@QAEXABH@Z)
Debug/q.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
q.exe - 2 error(s), 0 warning(s)
10 个解决方案
#1
定义要和你的头文件一致,改为:
template <class Type>
void TQueue::add(const Type& queueItem)
{
...
}
template <class Type>
void TQueue::add(const Type& queueItem)
{
...
}
#2
不行啊, 出现如下错
error C2955: 'TQueue' : use of class template requires template argument list
c:\queue\q\queue.h(91) : see declaration of 'TQueue'
error C2955: 'TQueue' : use of class template requires template argument list
c:\queue\q\queue.h(91) : see declaration of 'TQueue'
#3
template <class T>
void TQueue<T>::Add(const T& item)
{
}
void TQueue<T>::Add(const T& item)
{
}
#4
我的问题就是这样子不行啊
#5
绝不是拼写错误的问题啦,
#6
定义和函数声明都必须放在同一个h文件中,要不vc编译器会报错.
但有些编译器允许,详细参考C++ Primer
但有些编译器允许,详细参考C++ Primer
#7
建议阅读C++ Templates一书.
#8
cpp文件是否已加入到工程中?
#9
当然已经添加到工程了啊
#10
可以放在不同的文件中,采用“包含”模型。
在你的模板声明头文件的末尾,增加#inlcude 源文件
// my template header file
// template.h
template<calss T> class Cls
{
}
#include "template.cpp"
// template implementation file
// template.cpp
#include "template.h"
.....
// another file to quote the template class
// test.cpp
#include "template.h"
ok, it's ready to quote your template class.
在你的模板声明头文件的末尾,增加#inlcude 源文件
// my template header file
// template.h
template<calss T> class Cls
{
}
#include "template.cpp"
// template implementation file
// template.cpp
#include "template.h"
.....
// another file to quote the template class
// test.cpp
#include "template.h"
ok, it's ready to quote your template class.
#1
定义要和你的头文件一致,改为:
template <class Type>
void TQueue::add(const Type& queueItem)
{
...
}
template <class Type>
void TQueue::add(const Type& queueItem)
{
...
}
#2
不行啊, 出现如下错
error C2955: 'TQueue' : use of class template requires template argument list
c:\queue\q\queue.h(91) : see declaration of 'TQueue'
error C2955: 'TQueue' : use of class template requires template argument list
c:\queue\q\queue.h(91) : see declaration of 'TQueue'
#3
template <class T>
void TQueue<T>::Add(const T& item)
{
}
void TQueue<T>::Add(const T& item)
{
}
#4
我的问题就是这样子不行啊
#5
绝不是拼写错误的问题啦,
#6
定义和函数声明都必须放在同一个h文件中,要不vc编译器会报错.
但有些编译器允许,详细参考C++ Primer
但有些编译器允许,详细参考C++ Primer
#7
建议阅读C++ Templates一书.
#8
cpp文件是否已加入到工程中?
#9
当然已经添加到工程了啊
#10
可以放在不同的文件中,采用“包含”模型。
在你的模板声明头文件的末尾,增加#inlcude 源文件
// my template header file
// template.h
template<calss T> class Cls
{
}
#include "template.cpp"
// template implementation file
// template.cpp
#include "template.h"
.....
// another file to quote the template class
// test.cpp
#include "template.h"
ok, it's ready to quote your template class.
在你的模板声明头文件的末尾,增加#inlcude 源文件
// my template header file
// template.h
template<calss T> class Cls
{
}
#include "template.cpp"
// template implementation file
// template.cpp
#include "template.h"
.....
// another file to quote the template class
// test.cpp
#include "template.h"
ok, it's ready to quote your template class.