Стандарт говорит, что мы можем определить шаблон статического члена данных, такой как шаблон класса и шаблон функции, но как именно? - PullRequest
1 голос
/ 28 мая 2011

Глава «Шаблоны» в стандарте C ++ 03 начинается со следующего:

A template определяет семейство классов или функций.

<i>template-declaration:  
     export<sub>opt</sub> template < template-parameter-list > declaration
template-parameter-list:
     template-parameter
     template-parameter-list , template-parameter
</i>

объявление в шаблонном объявлении должно

- объявить или определить функцию или класс, или

- определить функцию-член, класс-член или статический элемент данных шаблона класса или класса, вложенного в шаблон класса, или

- определить шаблон-членкласс или шаблон класса.

A шаблон-объявление - это объявление . шаблон-объявление также является определением, если его объявление определяет функцию, класс или статический член данных.

Итак, из того, что я понимаючтение полужирного текста означает, что мы можем определить статический шаблон данных-элемента , в дополнение к class -template и function-template ,Но я никогда не видел static data-member-template .Как именно это определяется?Я попробовал следующее, но GCC не принимает его ( ideone ):

template<typename T> struct X{};

template<typename T>
struct A
{
   template<typename U> static X<U> data_member;
};

Поэтому я начал сомневаться в том, правильно ли я понял цитату.Что именно мне не хватает?Или как именно мы можем определить шаблон элемента статических данных?Что означает жирный текст?

Ответы [ 2 ]

5 голосов
/ 28 мая 2011

Нет, это относится к:

template<typename T> int A<T>::staticDataMember;
//                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~ declaration

Если A - это шаблон класса, подобный следующему

template<typename T>
struct A { static int staticDataMember; };
0 голосов
/ 28 мая 2011

Вы никогда не указали data_member фактический тип.

template<typename T> struct X{};

template<typename T>
struct A
{
   static X<T> data_member;
};
...