C++:单一实例类模板导致链接错误

C++: Singleton class template causes linking error?

本文关键字:链接 错误 单一 实例 C++      更新时间:2023-10-16

我试图创建一个单例(基本)类:

template<typename SUBCLASS>
class Singleton {
public:
    static SUBCLASS& get_instance() {
        static SUBCLASS instance;
        return instance;
    }
};

此单例类位于头文件中,该文件可以包含在任何其他文件中。 例如,一个类可能看起来像这样:

class MyClass : public Singleton<MyClass> {
public:
...
private:
    MyClass() {
    }
    friend Singleton<MyClass>;
}

其他地方MyClass可以像这样使用:

MyClass& instance = MyClass::get_instance();

优点:编译有效。不好的一点:链接失败。

错误消息是:

undefined reference to `MyClass::get_instance()'

我做错了什么?有人提示吗?

非常感谢

此致敬意

凯文

您可以使用

using关键字:

class MyClass : public Singleton<MyClass> {
public:
    using Singleton<MyClass>::get_instance;
...
private:
    MyClass() {
    }
    friend Singleton<MyClass>;
}

这会将函数拉入MyClass的范围。

对我来说

编译得很好。

#include <iostream>
template<typename SUBCLASS>
class Singleton {
public:
    static SUBCLASS& get_instance() {
        static SUBCLASS instance;
        return instance;
    }
};
class MyClass : public Singleton<MyClass> {
public:
private:
    MyClass() {
    }
    friend Singleton<MyClass>;
};
int main()
{
    using namespace std;
    MyClass& a = MyClass::get_instance();
    return 0;
}

编译方式:

c++ singleton.cpp

在编译过程中,可以省略未引用的静态方法。可以通过在同一编译单元中引用该方法或通过更改特定于编译器的优化设置来解决此问题。

另一种方法可能是显式实例化模板,如下所示:

template class Singleton<MyClass>;