我正在尝试理解静态数据成员模板的概念。我在一本书中遇到了以下例子:
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中,或者只在使用这个模板的文件中,这取决于您的项目结构。