template class member funkcja tylko specjalizacja

Czytam cały poradnik o szablonach i jest w nim napisane co następuje:

Gdzie mówi się o specjalizacji szablonu klasy.

Jednakże, jeśli specjalizujesz się w klasie szablon, musisz również specjalizować się we wszystkich funkcje członków. Chociaż jest możliwość wyspecjalizowania jednego członka funkcji, gdy już to zrobisz, możesz nie może już specjalizować się w całości klasy.

Zastanawiam się, jak to jest prawdą, bo można specjalizować się bez każdy członek w ogóle funkcjonuje. Czy to mówi, że nie możesz mieć specjalizacji tylko z jedną funkcją członka, a następnie inną ze wszystkimi funkcjami członka?

Czy ktoś może wyjaśnić?

Author: Tony The Lion, 2011-05-10

2 answers

Myślę, że odnosi się to do następującego przypadku:

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
}

Gdy już to zrobisz, nie możesz przeznaczyć całego szablonu na jakąkolwiek inną rzecz, więc

template <>
struct base<int> {};  // error
 29
Author: David Rodríguez - dribeas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-10 12:50:54

Myślę, że chodzi o to, że możesz albo:

  • Specjalizacja całej klasy i wszystkie elementy składowe (Dane i funkcje, statyczne lub nie, wirtualne lub nie) muszą być zadeklarowane i zdefiniowane, nawet jeśli są takie same jak dla wersji niewyspecjalizowanej,

  • Specjalizujemy niektóre elementy funkcji, ale wtedy nie możemy specjalizować całej klasy (tzn. wszystkie elementy są zadeklarowane w taki sam sposób jak w przypadku niewyspecjalizowanym, po prostu dostarczamy implementację dla niektórych funkcji członków).

 0
Author: AProgrammer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-10 12:50:09