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

Я читаю «Полное руководство по шаблонам 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 :: foo и C :: bar , так что учебник неверен, выходит ли gcc за рамки стандарта, или я недопонимание всей ситуации?

Спасибо.

6
задан spraff 3 August 2011 в 16:55
поделиться