Специализация шаблона в определении шаблона: поддерживается ли это для всех компиляторов или для стандартного использования?

#c #templates #template-specialization

#c #шаблоны #специализация шаблона

Вопрос:

Это скомпилировано на VS 2008, но похоже на нестандартное использование шаблонов.

 template <class T>
class Foo
{
public:
  void bar(Foo<int> arg)
  {
    // do some stuff here
  }

  // more code ...
};
  

Есть ли проблема, поскольку специализация шаблона Foo<int> содержится в определении его собственного класса template?

Ответ №1:

На самом деле это не специализация — вы просто говорите, что функция принимает параметр типа Foo <int> — тот факт, что функция сама по себе является членом класса Foo, на самом деле не важен. И да, это законно.

Комментарии:

1. Тем не менее, он использовал правильный термин. Foo<int> является ссылкой на специализацию шаблона класса (генерируемая специализация при создании экземпляра, но может быть ссылкой на явную специализацию). Но я подозреваю, как и вы, что он имел в виду явные специализации, но случайно перепутал это с общим термином специализации шаблона. Вот что мы получаем из сложных определений C 🙂

2. @Johannes Вы, конечно, правы, но я думаю, что большинство людей назвали бы это (возможно, ошибочно) созданием экземпляра. В любом случае, я использую слово «действительно» по назначению, чтобы охватить все базы 🙂