如何显示类模板特化

pdaliu 2012-06-13 09:30:04

#include <iostream>
// 声明部分
template <class Type>
class Queue;

template <class Type>
class QueueItem;

template<class Type>
std::ostream& operator<<(std::ostream &os,Queue<Type>&);

template<class Type>
std::ostream& operator<<(std::ostream &,QueueItem<Type>&);

////////////////////////////////////////////////////////////
template <class Type>
class Queue{
friend std::ostream& operator<< <Type>(std::ostream&, Queue<Type>&);
public:
Queue():front(0),back(0){}
~Queue();
Type remove();
void add(const Type&);
bool is_empty()const{
return 0==front;
}
private:
QueueItem<Type> *front;
QueueItem<Type> *back;
};



typedef char *PCC;
template <>void Queue<PCC>::add(const PCC &tem);//特化生明

我把特化定义放到头文件或程序文件中都会编译出错,是因为编译器的原因还是我没写对?下面是我的特化定义。

template <>
void Queue<PCC>::add(const PCC &tem)
{
std::cout << "显示类模板特化";
}

出错信息:
1>main.obj : error LNK2005: "public: void __thiscall Queue<char *>::add(char * const &)" (?add@?$Queue@PAD@@QAEXABQAD@Z) already defined in model1.obj

...全文
117 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pdaliu 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

引用 1 楼 的回复:
C/C++ code

#include <iostream>

template <class T>
class TEST
{
public:
TEST()
{}
void func();
private:
T val;
};

template<> void TEST<int>::func()
{
std::cout<<……

……
[/Quote]
我开始写了一个没有特化模板,是分成两个文件,一个头文件,一个程序文件。在这个“工程”里,我写的类模板特化就就一直在连接时出问题。不过我新建一个工程,把代码COPY进来编译就没有问题了!
漫步者、 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
C/C++ code

#include <iostream>

template <class T>
class TEST
{
public:
TEST()
{}
void func();
private:
T val;
};

template<> void TEST<int>::func()
{
std::cout<<……
[/Quote]
他的定义应该是放在头文件中,应该不会出现问题的,不要放在cpp文件中定义。
SONG_CA 2012-06-14
  • 打赏
  • 举报
回复
typedef char *PCC;
//template <>void Queue<PCC>::add(const PCC &tem);//特化生明

感觉上述第2句是多余的呢


漫步者、 2012-06-14
  • 打赏
  • 举报
回复
都放在头文件中编译,如果分开放的话编译器中模版的分离模式不能够很好地被支持,建议还是放在头文件中就行了,就采取包含模式编译。
pdaliu 2012-06-13
  • 打赏
  • 举报
回复

#include <iostream>

template <class T>
class TEST
{
public:
TEST()
{}
void func();
private:
T val;
};

template<> void TEST<int>::func()
{
std::cout<<"显示类模板特化";
}

template <class T>
void TEST<T>::func()
{
std::cout<<"非特化";
}

我又新建了一个工程,又新写了一个简单的类模板,这里的特化就可以正常运行。

64,673

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧