This question already has answers here:
Why can templates only be implemented in the header file?

(17个答案)


3年前关闭。




我有一个包含针对我的项目的常用功能的类。功能之一是模板静态:

common.h

#include <QMetaEnum>
#include <QString>

class Common
{
public:
    Common();
    template<typename T> static QString EnumToString(const T value);
};

等等实现:

common.cpp

template<typename T>
QString Common::EnumToString (const T value)
{
    return QString(QMetaEnum::fromType<T>().valueToKey(value));
}

编译没有问题,但是当我想使用如下功能时:

MyEnum enum = MyEnum::Value1;
qDebug() << Common::EnumToString<MyEnum>(enum);

我收到一些奇怪的链接器错误:



MyEnum已在Qt元系统中注册:
enum class MyEnum
{
    Value1,
    Value2,
    Value3
};
Q_ENUM(MyEnum);

我做错了什么以及如何使其起作用?

最佳答案

非专业的模板需要在头文件中实现。
如果将Common::EnumToString的实现放在common.h内,它将起作用。

关于c++ - 未定义对静态模板函数的引用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47535402/

10-14 04:51