0

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

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

当我尝试执行程序时,它给出的错误是:

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'

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

4

2 回答 2

3

是的,这是书中的一个错字。问题是您已经为静态数据成员模板指定了一个初始化程序,即使它不是inline

解决方案

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

方法一: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

在这种情况下,您需要从静态数据成员模板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>;
}
于 2022-01-25T11:13:04.403 回答
-1

这不是特定于模板的问题,而是类的静态成员的初始化。不同之处在于,在模板的情况下,您通常在标头中有完整的实现,因此您没有与此类相关的 cpp 文件(也没有编译单元)。您可以添加此定义/初始化,例如在您的类中的 cpp 中或仅在您使用此模板的文件中,这取决于您的项目的结构。

于 2022-01-25T11:19:40.140 回答