奇怪的模板类+虚函数问题

lucifer886 2014-05-29 10:27:49
代码如下,abstract.h文件

template<typename T>
class abstract
{
public:
abstract(const T& type);
virtual ~abstract();

const T& type() const
{ return m_iType; }

protected:
virtual void parser() = 0;

private:
T m_iType;
};


abstract.cpp文件

template <typename T>
abstract<T>::abstract(const T &type, QObject *parent)
:QObject(parent),
m_iType(type)
{
}

template <typename T>
abstract<T>::~abstract()
{
}


这个用于继承的类没问题,然后下面我派生了一个类
derive.h文件

#include "abstract.h"

class derive
:public abstract<std::string>
{
public:
derive(const std::string& type, QObject *parent = 0)
:abstract<std::string>(type, parent)
{
}

~derive()
{}

protected:
void parser()
{}
};


我的实现如果写在.h里,那么是可以编译通过的;
但是如果我把定义和实现分离,按常见的C++写法放到CPP文件里,链接的时候就会报错,说无法链接到derive的构造和析构函数,而且还构造函数错误报了3个,析构报了两个……

百思不得其解,求解答……
...全文
203 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sdghchj 2014-05-29
  • 打赏
  • 举报
回复
如果你把abstract的声明与实现合并,那么你的derive即使是分离了,也不会报错。 当然还有种处理方式:你在derive的头文件里同时include abstract.h和abstract.cpp,也能编译通过。 总之,模板的声明与实现对于另一个实例化类应该是完全可见的就行
sdghchj 2014-05-29
  • 打赏
  • 举报
回复
模板的声明与实现不建议分开成h和cpp文件,建议都在一个头文件中进行。 你代码问题不是在于derive的声明与实现的分离,而根源是abstract这个模板的声明与实现被分离了。 模板本身的声明与实现本身并不会被编译进obj文件,只要当你有实例化模板的代码出现时,才会去找对应的模版并用模板参数与实现化后再进行对应的编译进obj文件。 你在derive里继承该模版,并以参数std::string类为模板参数,相当于实例化了该模版,编译器才会用std::string去替换模版中的模版参数编译成一个虚类abstract<std::string>。如果你又在某处写了代码如abstract<int>,那么又会生成一个对应的新虚类。就有了模版的两个实例。 总之,模版其实跟宏定义一样,编译的时候就用对应的东东替换了,编译完成后其本身是不会存在在二进制代码里的。
ri_aje 2014-05-29
  • 打赏
  • 举报
回复
c++ 模板不支持分离编译,都放在头文件即可。 至于为什么,标准就这么规定的;曾经有个 export 关键字做楼主需要的事情,可惜只有一个编译器实现了,所以后来 export 就作废了。
mujiok2003 2014-05-29
  • 打赏
  • 举报
回复
引用
但是如果我把定义和实现分离,按常见的C++写法放到CPP文件里,链接的时候就会报错,说无法链接到derive的构造和析构函数,而且还构造函数错误报了3个,析构报了两个……
模本的定义要放在头文件。
lucifer886 2014-05-29
  • 打赏
  • 举报
回复
那个QObject大家可以忽略掉,我代码贴错了一部分

65,176

社区成员

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

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