将构造函数模板的实现与头文件分离

3
可能会有重复:
为什么模板类的实现和声明应该在同一个头文件中? 我的头文件包含了
template <typename T>
class AA : public BB<T>
{
public:
    AA()
    { ... }

这很好运作。但我需要将构造函数的实现与头文件分离。
因此在cpp中,我有:
template <typename T>
AA<T>::AA()
{ ... }

当我编译这段代码时,它的确编译通过了,但我却遇到了 unresolved external symbol 错误。请问我漏掉了什么?

不建议这样做,但是你可以进入你的cpp文件,在最后实例化所有可能的模板,比如 AA<int> a; AA<double> c; 等来解决链接错误。 - parapura rajkumar
你需要购买一个使用Edison Design Group前端的编译器。他们是唯一实现模板外部链接的人。这在当前的C++标准中已经被弃用。最有影响力的反对弃用的投票来自Edison Design Group。 - Hans Passant
1
@HansPassant:在当前的C++标准中,模板名称可以(并且通常)具有外部链接,并且自上一个标准以来这一点并没有改变。另一方面,“export”和“导出”模板的概念已从C++11中删除(而不是弃用)。 - CB Bailey
1
@Paul:如果你不介意问题被关闭,那么发布重复的帖子并没有什么实质性的伤害。:-] - ildjarn
1
那确实是正确的措辞。但如果模板具有外部链接而不是模板实例化,那么这就不会是一个普遍的问题了。 - Hans Passant
显示剩余3条评论
2个回答

6
您可以使用以下方式在实现文件中明确实例化模板:
template class AA<int>;

这将从模板生成一个定义,但只有当您知道您的类客户端将使用哪些类型时才有用。


2
如果你将模板实现放入.cpp文件中,你需要确保它被实例化:编译器不会自动为你执行。大约一天前也有类似的问题得到回答:模板必须总是在头文件中吗?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接