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