专门化时未定义对静态成员变量的引用

Undefined reference to static member variable when specializing

我有以下代码:

    struct All { 
    All() {} 
    ~All() {}

    template <typename T>
    static struct Item {
        T var;
    } item;
    virtual void setVal() noexcept {} 
};

template <typename T>
struct any : public All
{
    public:
        any() : All() {}
        ~any() {}
        T value; 
        void setVal() noexcept override {
            All::item<decltype(value)>.var = value; // Error appears here
        }
};

并出现以下错误:

undefined reference to All:item<int>

我不明白这个错误,因为item是一个静态成员变量模板,我必须专门化它...

帮帮我!

你的错误是你从来没有定义静态成员变量。你只是声明了它。添加定义:

template <typename T>
All::Item<T> All::item = {};

但是,我测试的编译器不接受您定义成员变量模板类型和声明变量本身的语法。 g++ (5.2.0) 的声明很好,但在为变量定义指定类型时抱怨 All::Item 不是模板。 clang++ (3.6.0) 甚至不接受你的声明。简单地分离类型的定义和变量的声明解决了这个问题:

template <typename T>
struct Item {
    T var;
};

template <typename T>
static Item<T> item;