шаблонная функция-член только специализация - PullRequest
29 голосов
/ 10 мая 2011

Я читаю Полное руководство по шаблонам, в котором говорится следующее:

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

Однако, если вы специализируете класс шаблон, вы также должны специализировать все функции-члены. Хотя это является можно специализировать одного члена функция, как только вы это сделали, вы больше не может специализировать весь класс.

Мне действительно интересно, как это так, потому что вы можете специализироваться без каких-либо функций-членов вообще. Это говорит о том, что у вас не может быть специализации только с одной функцией-членом, а затем со всеми функциями-членами?

Может кто-нибудь уточнить, пожалуйста?

Ответы [ 2 ]

31 голосов
/ 10 мая 2011

Я думаю, что это относится к следующему случаю:

template <typename T>
struct base {
   void foo() { std::cout << "generic" << std::endl; }
   void bar() { std::cout << "bar" << std::endl; }
};
template <>
void base<int>::foo() // specialize only one member
{ 
   std::cout << "int" << std::endl; 
}
int main() {
   base<int> i;
   i.foo();         // int
   i.bar();         // bar
}

Как только это будет сделано, вы не можете специализировать полный шаблон для какой-либо другой вещи, поэтому

template <>
struct base<int> {};  // error
0 голосов
/ 10 мая 2011

Я думаю, что имеется в виду, что вы можете:

  • специализирует весь класс, и все члены (данные и функции, статические или нет, виртуальные или нет) должны быть объявлены и определены, даже если они такие же, как и для неспециализированной версии,

  • специализируют некоторые функции-члены, но тогда вы не можете специализировать весь класс (т. Е. Все члены объявляются так же, как и для неспециализированного случая, вы просто предоставляете реализацию для некоторых членов функции).

...