标准说,我们可以定义静态数据成员模板,如类模板和函数模板,但究竟如何?

Naw*_*waz 1 c++ static templates datamember

C++ 03 Standard中的模板章节从以下内容开始:

一个模板定义了一类或函数.

template-declaration:  
     exportopt template < template-parameter-list > declaration
template-parameter-list:
     template-parameter
     template-parameter-list , template-parameter

声明模板声明

- 声明或定义函数或类,或

- 定义成员函数,成员类类模板的静态数据成员或嵌套在类模板中的类,或者

- 定义类或类模板的成员模板.

一个模板声明是一个声明.如果模板声明声明定义了函数,类或静态数据成员,那么它也是一个定义.

因此,根据我的理解,阅读粗体文本是除了类-templatefunction-template之外,我们还可以定义静态数据成员模板.但我从未见过静态数据成员模板.究竟是如何定义的?我尝试了以下内容,但GCC不接受它(ideone):

template<typename T> struct X{};

template<typename T>
struct A
{
   template<typename U> static X<U> data_member;
};
Run Code Online (Sandbox Code Playgroud)

所以我开始怀疑自己是否正确理解了报价.我到底错过了什么?或者我们如何定义静态数据成员模板呢?粗体文字是什么意思?

Joh*_*itb 5

不,它指的是:

template<typename T> int A<T>::staticDataMember;
//                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~ declaration
Run Code Online (Sandbox Code Playgroud)

如果A是类模板,如下所示

template<typename T>
struct A { static int staticDataMember; };
Run Code Online (Sandbox Code Playgroud)

  • 我爱铿锵:) (2认同)