Подтвердить что ты не робот

Функция класса шаблона только специализация

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

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

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

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

Кто-нибудь может прояснить?

4b9b3361

Ответ 1

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

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

Ответ 2

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

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

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