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

Глава о шаблонах в стандарте C++03 начинается со следующего:

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

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

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

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

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

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

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

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

template<typename T> struct X{};

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

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


person Nawaz    schedule 28.05.2011    source источник
comment
Это не определяет статический элемент данных, а просто декларирует его.   -  person Philipp    schedule 28.05.2011
comment
Упс... Я получил отрицательный голос за вопрос и разъяснение своих сомнений. :|   -  person Nawaz    schedule 28.05.2011
comment
Не от меня, не знаю, откуда это.   -  person Philipp    schedule 28.05.2011


Ответы (2)


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

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

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

template<typename T>
struct A { static int staticDataMember; };
person Johannes Schaub - litb    schedule 28.05.2011
comment
Аааа.. вроде правильно. Йоханнес, как всегда круто :D... +1. - person Nawaz; 28.05.2011
comment
Я люблю подчеркивание clang :) - person David Rodríguez - dribeas; 28.05.2011
comment
Правильно, потому что в коде Наваза не определен статический элемент данных. - person Philipp; 28.05.2011
comment
Можете ли вы дать мне полный рабочий пример? Это будет полезно и для других. - person Nawaz; 28.05.2011

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

template<typename T> struct X{};

template<typename T>
struct A
{
   static X<T> data_member;
};
person Puppy    schedule 28.05.2011
comment
Но это объявление не имеет формы template < template-parameter-list > declaration, как говорится в цитате. - person Nawaz; 28.05.2011