自定义一个模板类, 声明和定义不能分别放到.h和.cpp文件中吗?

时间:2022-09-11 19:54:57
看我下面的代码:

//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)
{
...
}

#2


不行啊, 出现如下错


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)
{
}

#4


我的问题就是这样子不行啊

#5


绝不是拼写错误的问题啦,

#6


定义和函数声明都必须放在同一个h文件中,要不vc编译器会报错.
但有些编译器允许,详细参考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.

#1


定义要和你的头文件一致,改为:

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'

#3


template <class T>
void TQueue<T>::Add(const T& item)
{
}

#4


我的问题就是这样子不行啊

#5


绝不是拼写错误的问题啦,

#6


定义和函数声明都必须放在同一个h文件中,要不vc编译器会报错.
但有些编译器允许,详细参考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.