在源中重载的标头中使用模板中的方法
Using a method from a template in a header that has been overloaded in a source
我很清楚这是一个非常新手的问题,对此我深表歉意,但我已经搜索了很多,但找不到解决方案。
我有以下文件:
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的测试对象。
相关文章:
- C++:涉及继承和"using"时的方法重载
- 如何让编译器在C++中更喜欢常量方法重载?
- 为什么方法重载或枚举标志定义会触发 gcc7.2 编译器警告?
- C++模板方法重载和具有多态性的类访问
- 基于方法重载类
- 方法重载 C++ -> 只有一个方法调用
- 如何使用 SFINAE 禁用方法重载集?
- 使用类别方法重载 NSDecimalNumber 上的算术运算符
- C++继承和方法重载混淆
- 多态性和方法重载在C++中几乎是一样的
- 了解方法重载规则
- c++编译错误涉及方法重载的2个模板函数
- Qt/Qml 和方法重载
- 参数或方法重载的幻数
- 为什么C++更喜欢这个模板方法而不是方法重载
- C++方法重载
- 在C++中使用非友元方法重载 I/O 运算符 |&istream 和 &ostream 函数
- 插入方法重载
- 函数重载和方法重载之间的区别
- 正在解决跨基类的虚拟方法重载