在源中重载的标头中使用模板中的方法

Using a method from a template in a header that has been overloaded in a source

本文关键字:方法 重载      更新时间:2023-10-16

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

我有以下文件:

headertes.hpp

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

ImplementationTest.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在同一个文件中,但您必须将其放在头中才能正常使用。

编辑:关于标头/cpp问题。

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

但是,模板是这个规则的例外。模板的定义必须在实例化时完全可访问。这是一个很好的说法,当你使用模板时,你必须包含所有的源代码(而不是"普通"对象,它们的声明就足够了)。最简单的方法是什么?把它全部放在标题中。

如果这对你来说不干净,还有一种选择:把你的模板定义放在第三个文件中,通常称为"模板实现文件",并扩展为.tpp。然后,只在头文件底部#include你的tpp文件。

在main()函数中添加以下两行:

  HeaderTest<int> test;
  cout << test.addition(x, y);

因此,您首先必须为整数创建一个HeaderTest对象。接下来,当您将加法定义为成员函数时,您可以将其应用于整数x和y的测试对象。