gpt4 book ai didi

c++ - 模板化父类(super class)链接问题

转载 作者:搜寻专家 更新时间:2023-10-31 00:24:24 25 4
gpt4 key购买 nike

我正在尝试创建一个带有模板化父类(super class)的 C++ 类。这个想法是,我可以很容易地从许多具有相似特征的父类(super class)中创建许多相似的子类。

我已经提炼出有问题的代码如下:

template_test.h :

template<class BaseClass>
class Templated : public BaseClass
{
public:
Templated(int a);
virtual int Foo();
};

class Base
{
protected:
Base(int a);
public:
virtual int Foo() = 0;
protected:
int b;
};

template_test.cpp :

#include "template_test.h"

Base::Base(int a)
: b(a+1)
{
}

template<class BaseClass>
Templated<BaseClass>::Templated(int a)
: BaseClass(a)
{
}

template<class BaseClass>
int Templated<BaseClass>::Foo()
{
return this->b;
}

main.cpp :

#include "template_test.h"

int main()
{
Templated<Base> test(1);
return test.Foo();
}

当我构建代码时,出现链接器错误,提示符号 Templated<Base>::Templated(int)Templated<Base>::Foo()找不到。

快速 Google 建议将以下内容添加到 main.cpp将解决问题:

template<> Templated<Base>::Templated(int a);
template<> int Templated<Base>::Foo();

但这并不能解决问题。将这些行添加到 main.cpp也不起作用。 (虽然,有趣的是,将它们添加到两者都会导致链接器出现“多重定义的符号”错误,因此它们一定在做某事......)

但是,将所有代码放在一个源文件中确实可以解决问题。虽然这对于上面的 noddy 示例来说没问题,但如果我被迫将所有内容都放在一个 cpp 文件中,那么我正在查看的真实应用程序将很快变得难以管理。

有谁知道我正在做的事情是否可行? (如何)解决我的链接器错误?

我假设我可以制作 class Templated 中的所有方法内联,这会起作用,但这似乎也不理想。

最佳答案

对于模板化类,定义必须可用于使用它的每个翻译单元。这些定义可以放在一个单独的文件中,通常以 .inl.tcc 扩展名;头文件 #include 是底部的文件。因此,即使它在一个单独的文件中,它仍然是每个翻译单元的#include;它不能是独立的。

因此,对于您的示例,将 template_test.cpp 重命名为 template_test.inl(或 template_test.tcc,或其他),然后#include "template_test.inl"(或其他)在 template_test.h 的底部,就在 include guard 的 #endif 之前。

希望这对您有所帮助!

关于c++ - 模板化父类(super class)链接问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/207730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com