c++ - 在已在源中重载的 header 中使用模板中的方法

标签 c++

我很清楚这是一个非常新的问题,对此我深表歉意,但我一直在搜索,但找不到解决方案。

我有以下文件:

headertest.hpp

template<typename t>
class HeaderTest {
    private:
        int x;
    public:
        //HeaderTest();
        t addition(t a, t b);
};

执行测试.cpp

#include "headertest.hpp"

template<typename t>
t HeaderTest<t>::addition(t a, t b) {
    return a + b;
}

int main() {
    int x = 2;
    int y = 3;
}

假设我想对这两个整数 x 和 y 求和,我将如何使用我的方法加法?

最佳答案

int main() {
    int x = 2;
    int y = 3;

    HeaderTest<int> ht; // Instantiate a HeaderTest

    int z = ht.addition(x, y); // Use its member function.
}

请注意,模板定义不应在 cpp 文件中。这在这里有效,因为 main 在同一个文件中,但您必须将它放在标题中才能正常使用。

编辑关于 header /cpp 问题。

你已经完全理解了。声明(接口(interface))放在头文件中,定义(实现,即实际代码)放在 cpp 文件中。

但是,模板是这个规则的异常(exception)。模板的定义必须在其实例化时完全可访问。说当您使用模板时,您必须包含其所有 源代码(与“普通”对象相反,其声明就足够了),这有点含糊。最简单的方法是什么?将其全部放在标题中。

如果这对您来说似乎不干净,还有一个替代方案:将您的模板定义放在第三个文件中,通常称为“模板实现文件”和扩展的 .tpp。然后,只需 #include 您的头文件底部的 tpp 文件即可。

关于c++ - 在已在源中重载的 header 中使用模板中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25549472/

相关文章:

c++ - 当我编译我的 C++ 代码时,avast 认为它是病毒

c++ - 在 C++ 和 Python 之间共享视频数据

c++ - 在编译时检测 Visual Studio 构建工具版本

c++ - Firemonkey:缩小文本字体以适应 TLabel

c++编译时字符串连接使用boost-mpl

c++ - 为什么要使用 std::forward?

c++ - 无法获取 libcurl 中的证书位置

c++ - 有和没有事件循环的线程之间的区别

c++ - 使用 std::thread 时,主线程中的 while 循环卡住了

c++ - 内存泄漏预防 C++(我是对还是错?)