代码之家  ›  专栏  ›  技术社区  ›  jwm

XCode警告“这里需要变量'Singleton<Foo>::'u instance'的实例化,但没有可用的定义”

  •  2
  • jwm  · 技术社区  · 6 年前

    遗留代码库具有以下构造:

    template< typename T >
    class Singleton {
    private:
        static T* _instance;
    public:
        inline static T& instance() {
            if (_instance == 0) { // warning here
                _instance = new T;
            }
            return *_instance;
        }
    };
    

    通常使用如下:

    class Foo : public Singleton<Foo>
    {
    };
    

    警告是从任何包含 Foo.hh .

    目前, Foo.cpp 包括这一行:

    template<>
    Foo* Singleton<Foo>::_instance = nullptr;
    

    但这无助于编译。在定义Foo之前,是否有方法提供Singleton::u实例的定义?

    XCode 9.2 Mac操作系统X 10.12.6

    1 回复  |  直到 6 年前
        1
  •  2
  •   lubgr    6 年前

    在头文件中,添加

    template <typename T> T* Singleton<T>::_instance = nullptr;
    

    这仍然是一个越界的定义,但与特定的专业化无关。你应该可以删除这一行

    template<> Foo* Singleton<Foo>::_instance = nullptr;
    

    因为上面的非专用定义已经对所有实例化执行了相同的操作。