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

Undefined reference to static member variable when specializing

本文关键字:未定义 引用 变量 静态成员 专门化      更新时间:2023-10-16

我有以下代码:

    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
        }
};

和以下错误:

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;