Является ли `template <>` необязательным при специализации шаблона класса с использованием другого шаблона класса? - PullRequest
3 голосов
/ 17 июня 2011

Я пытался специализировать шаблон класса другим, как в примере ниже, и я заметил, что он компилируется и запускается (по крайней мере, на ideone, то есть: gcc 4.3.4), закомментирована ли строка закомментированных строкили нет.

#include <iostream>
template <typename F>
struct foo{
  typedef F value_type;
};

template <typename G>
struct bar{};

//template<>  <- works if commented out or not
template <typename F>
struct bar<foo<F> >
{
  typename foo<F>::value_type val;
};

int main(void)
{
  typedef foo<int> F;
  typedef bar<F> B;
  B b;
  b.val = 10;
  std::cout << b.val << std::endl;
  return 0;
};

Так что мой вопрос, действительно ли это необязательно?У меня сложилось впечатление, что для такой специализации требуется строка template<>.

Ответы [ 3 ]

3 голосов
/ 17 июня 2011

Эта строка должна не быть там.

При полной специализации есть template<>, и это обязательно. Выполняя частичную специализацию, вы помещаете параметры частичной специализации в эти угловые скобки, и нет дополнительного ключевого слова template.

Итак, полная специализация:

template <>
struct bar<qyzzy>

и частичная специализация:

template <typename F>
struct bar<foo<F> >

У каждого есть ровно одно ключевое слово template и две пары угловых скобок.

3 голосов
/ 17 июня 2011

Это

template<>
template <typename F>
struct bar<foo<F> >;

должно быть синтаксической ошибкой, мне кажется.

1 голос
/ 17 июня 2011

Строка с template <> должна быть закомментирована.В противном случае это должно быть ошибкой.Bar является шаблоном уровня пространства имен, поэтому для того, чтобы специализировать его, вы просто пишете

template <parameters if any>
class bar <arguments>
{
};

Я понятия не имею, почему gcc принимает, когда вы раскомментируете строку.Я могу заверить вас, это, безусловно, должно не

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...