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



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

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'

我的问题是这是本书这个例子中的一个错误(打字错误(吗。如果是,那么问题出在哪里?我该如何解决?

是的,这是书中的一个拼写错误。问题是您为静态数据成员模板指定了初始值设定项,即使它不是内联

解决方案

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

方法1: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>;
}

方法2: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>;
}

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

最新更新