C ++:Singleton类模板导致链接错误?

时间:2016-01-20 12:11:54

标签: c++ templates linker singleton

我尝试制作单例(基础)类:

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()'

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

非常感谢

最好的问候

凯文

3 个答案:

答案 0 :(得分:1)

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

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

template class Singleton<MyClass>;

答案 1 :(得分:1)

为我编译好。

#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

答案 2 :(得分:1)

您可以使用using关键字:

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

    friend Singleton<MyClass>;
}

这将函数拉入MyClass的范围。