Инициализировать статический член внутреннего класса шаблона - PullRequest
4 голосов
/ 20 февраля 2010

У меня проблема с синтаксисом, необходимым для инициализации статического члена в шаблоне класса. Вот код (я пытался уменьшить его настолько, насколько мог):

template <typename T>
struct A
{
  template <typename T1>
  struct B
  {
    static T1 b;
  };

  B<T> b;
  typedef B<T> BT;
  T val() { return b.b; }
};

template <typename T>
T A<T>::BT::b;

struct D
{
  D() : d(0) {}
  int d;
};

int main()
{
  A<D> a;
  return a.val().d;
}

При g++ я получаю ошибку:

error: too few template-parameter-lists

Есть идеи как инициализировать b?

Обратите внимание, что я хотел бы сохранить typedef, так как в моем реальном коде B намного сложнее, чем это.

1 Ответ

6 голосов
/ 20 февраля 2010

Измените определение b на следующее:

template <typename T> template<typename T1>
T1 A<T>::B<T1>::b;

Обратите внимание, что typedef и B<T1> не обязательно указывают один и тот же тип: Хотя typedef полагается на передаваемую TB, B<T1> полагается на передаваемый параметр шаблона T1.Таким образом, вы не можете использовать typedef здесь, чтобы указать определение для b в B<T1>.

...