如何分离模板构造函数的实现(如果类不是模板)
How to separate a realisation of template constructor (if the class isn't template)
我读过这个页面为什么模板只能在头文件中实现?但它是关于一个模板类的。构造函数采用和类相同的类型(若类为<int>,构造函数也采用int,依此类推)。但我有一个简单的(非模板)类。很抱歉重复,请解释一下在这种情况下我该怎么办?
我有一个字段为"double d"的类"Object",我想创建一个模板构造函数。如果我在类内实现它,一切都很好,但如果将实现从.h移动到.cpp,那就不起作用了。这是我的代码:
Object.h
class Object {
double d;
public:
template <class T> Object(T t);
};
对象.cpp
#include "Object.h"
template <class T> Object::Object(T t) {
d = t;
}
main.cpp
#include "Object.h"
int main() {
int a = 5;
Object x(a);
float b = 2.5;
Object y(b);
return 0;
}
错误出现在main.cpp中创建x和y的行中,有:
undefined reference to `Object::Object<int>(int)'
undefined reference to `Object::Object<float>(float)'
去掉Object.cpp
并将其内容移动到头文件中。
当编译器处理Object.cpp
时,它不生成任何字节码,因为只有一些模板。当它在代码中遇到Object::Object<int>(int)
的"提及"时,它会转到头文件,推导模板参数并成功编译所有内容。
然而,链接者并不高兴。它看到对Object::Object<int>(int)
的调用,但找不到此方法的字节码,并引发错误。
否则,您可以在main
中定义template <class T> Object::Object(T t)
,但这不太好,可能会导致混淆。
您必须实现要在头文件中使用的所有模板。如果您只在.cpp文件中实现它们,那么只有.cpp文件才能看到它。
相关文章:
- 如果没有malloc,链表实现将失败
- 了解算法的性能差异(如果以不同的编程语言实现)
- 如果不包含 pthread,为什么 GCC 的线程标准库实现会抛出异常?
- C++:如果 std::atomic_flag 是唯一的无锁原子类型,如何在C++中实现无锁数据结构?
- unordered_set是否适合存储矢量<int>元素的数据结构?如果是这样,我将如何实现哈希函数?
- 如果我只实现了运算符<,我可以使用运算符 == 吗?
- 如果不在派生类实现中执行此操作,"basic_streambuf"是否会创建自己的获取/放置区域?
- 如果未实现虚函数,则大多数派生类无法编译,但如果一个基类未实现虚函数,则可以编译
- 如果类未完全实现,是否可以强制共享C++库无法生成?
- 如果我们使用链表数组来实现哈希表,则可以以不需要遍历的方式实现"add"。这是真的还是假的?
- 如果函数是在.cpp中实现的,则出现c++链接错误
- 如果未实现函数,则在链接时启用错误
- 如果我在头文件中实现了一个类,会发生什么
- 如果操作符delete没有实现,为什么不编译它
- 如何分离模板构造函数的实现(如果类不是模板)
- 如果在if语句中实现,函数将存储值
- 如果我使用 qt,我可以使用 c++ 来实现 qml 示例中的所有函数吗?
- 如果我在 Linux 上有 Pthread 代码,那么在 std::thread 中实现相同的代码是否有优势
- 如果有的话,可以实现Windows原生外观:GTK+,wxWidgets,Qt,FLTK
- 如果我不想在 QAbstractItemView 中实现选择,我应该返回哪些值?