Я читаю «Полное руководство по шаблонам C ++» Вандевурда и Йосуттиса (которое, кстати, кажется довольно хорошим). Это утверждение (раздел 3.3) кажется неверным и отсутствует в опубликованном исправлении :
Если вы специализируете шаблон класса, вы также должны специализировать все функции-члены. Хотя можно специализировать одну функцию-член, как только вы это сделаете, вы больше не сможете специализировать весь класс.
Однако следующий код компилируется на gcc template
struct C {
T foo ();
T bar ();
};
template <>
struct C {
int foo ();
int bar () {return 4;}
};
template
T C :: foo () {return 0;}
template
T C :: bar () {return 1;}
int C :: foo () {return 2;}
template <>
float C :: bar () {return 3;}
#include
int main () {
C i;
C f;
assert (2 == i .foo ());
assert (0 == f .foo ());
assert (4 == i .bar ());
assert (3 == f .bar ());
}
Я специализируюсь на C
и C
, так что учебник неверен, выходит ли gcc за рамки стандарта, или я недопонимание всей ситуации?
Спасибо.