婉儿0820 2023-01-09 19:24 采纳率: 0%
浏览 33

vs编写C++单例模板报错

打算写一个C++单例的模板类,编写完代码后,报一个链接错误。
操作系统:windows
编辑器:vs2017

代码

singleton.h

#include <mutex>
#include <iostream>

class TestSingleton;
template <class T>
class Singleton
{
private:
    Singleton() {};
    virtual ~Singleton() {}

public:
    static T* GetInstance();

private:
    static T* instance;
    //std::mutex mutex;
};

singleton.cpp

#include "Singleton.h"

template <class T>
T * Singleton<T>::instance = nullptr;

template <class T>
T* Singleton<T>::GetInstance()
{
    if (instance == nullptr)
    {
        instance = new T;
    }
    return instance;
}

main.cpp

#include <iostream>
#include "Singleton.h"

class TestSingleton
{
public:
    TestSingleton()
    {
    }
    ~TestSingleton()
    {
    }

    static void test()
    {
        std::cout << "TestSingleton::test" << std::endl;
    }

private:

};

int main()
{
    std::cout << "Hello World!\n";
    //单例测试代码
    /*TestSingleton sig;
    sig.test();*/
    //TestSingleton::test();
    Singleton<TestSingleton>::GetInstance()->test();
}
运行结果及详细报错内容

vs编译报以下错误

img

曾用过继承的方式编写调用singleton的代码,编译依然报错。
希望能够编译通过,请指教!

  • 写回答

1条回答 默认 最新

  • m0_54204465 2023-01-09 19:33
    关注

    看起来你在尝试使用 C++ 单例模板时遇到了一个链接错误。这是因为你在 singleton.cpp 中声明了单例模板的静态变量和成员函数,但是在 singleton.h 中没有定义它们。

    为了解决这个问题,你可以将 singleton.cpp 中的所有定义都移到 singleton.h 中,然后在 main.cpp 中包含 singleton.h,这样就可以正常编译和链接了。

    具体来说,你可以将 singleton.h 的内容修改为:

    #include <mutex>
    #include <iostream>
    
    template <class T>
    class Singleton
    {
    private:
        Singleton() {};
        virtual ~Singleton() {}
    public:
        static T* GetInstance();
    private:
        static T* instance;
        //std::mutex mutex;
    };
    
    template <class T>
    T * Singleton<T>::instance = nullptr;
    
    template <class T>
    T* Singleton<T>::GetInstance()
    {
        if (instance == nullptr)
        {
            instance = new T;
        }
        return instance;
    }
    
    

    并将 singleton.cpp 删除。

    需要注意的是,在 C++ 中使用单例模板的时候,通常需要使用实例化来生成单例的代码。你可以在 main.cpp 中添加以下代码来实例化单例模板:

    template class Singleton<TestSingleton>;
    
    

    这样就可以在 main 函数中使用 Singleton::GetInstance() 获取单例的实例了。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月9日

悬赏问题

  • ¥15 pyqt怎么把滑块和输入框相互绑定,求解决!
  • ¥20 wpf datagrid单元闪烁效果失灵
  • ¥15 券商软件上市公司信息获取问题
  • ¥100 ensp启动设备蓝屏,代码clock_watchdog_timeout
  • ¥15 Android studio AVD启动不了
  • ¥15 陆空双模式无人机怎么做
  • ¥15 想咨询点问题,与算法转换,负荷预测,数字孪生有关
  • ¥15 C#中的编译平台的区别影响
  • ¥15 软件供应链安全是跟可靠性有关还是跟安全性有关?
  • ¥15 电脑蓝屏logfilessrtsrttrail问题