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

时间:2014-08-28 13:00:47

标签: c++

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

我有以下文件:

headertest.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求和,我将如何使用我的方法添加?

2 个答案:

答案 0 :(得分:2)

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文件中。

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

如果这看起来不干净,那么可以选择:将模板定义放在第三个文件中,通常称为&#34;模板实现文件&#34;并扩展.tpp。然后,只需#include您的头文件底部的tpp文件。

答案 1 :(得分:0)

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

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

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