使用静态数据成员模板时出错

Error while using a static data member template

我正在尝试理解静态数据成员模板的概念。我在一本书中遇到了以下示例:

class Collection {
    public: 
    
    template<typename T>
    static T zero = 0;
}; 

当我尝试执行 program 时,出现以下错误:

undefined reference to `Collection::zero<int>'

为了解决上述错误,我尝试在上面的程序中添加了以下代码,但仍然报错:

template<typename T> T Collection::zero = 0; //even after adding this it still gives error

现在的错误是:

duplicate initialization of 'Collection::zero'

我的问题是这本书的这个例子是不是一个错误(打字错误)。如果是,那么问题是什么,我该如何解决?

是的,这是书中的错字。 问题是您为静态数据成员模板指定了一个初始化程序,即使它不是内联[=30] =].

解决方案

有两种方法可以解决这个问题,下面给出了这两种方法。

方法一:C++17

在 C++17 中,您可以使用关键字 inline

class Collection {
    public:
    
    
    template<typename T>
    inline static T zero = 0; //note the keyword inline here
}; 
//no need for out of class definition of static data member template
int main(){
    int x =Collection::zero<int>;
}

方法二:C++14

在这种情况下,您需要从静态数据成员模板的 in-class 声明 中删除初始化程序 0

class Collection {
    public:
    
    template<typename T>
    static T zero ; //note initializer 0 removed from here since this is a declaration
}; 

template<typename T> T Collection::zero = 0;
int main(){
    int x =Collection::zero<int>;
}

这不是问题 template-specific,而是 class 静态成员的初始化问题。不同之处在于,对于模板,您通常在 header 中有完整的实现,因此您没有与此 class 相关的 cpp 文件(也没有编译单元)。您可以添加此 definition/initialization 例如在 cpp 中与您的 class 或仅在您使用此模板的文件中,取决于您的项目结构。