Я читаю Vandevoorde и Josuttis "C ++ Templates The Complete Guide" (что, кстати, кажется довольно хорошим).Это утверждение (раздел 3.3), по-видимому, неверно и отсутствует в опубликованных ошибках :
Если вы специализируете шаблон класса, вы также должны специализировать все функции-члены.Хотя можно специализировать одну функцию-член, но после этого вы больше не можете специализировать весь класс.
Тем не менее следующие компиляции в шаблоне gcc
<typename T>
struct C {
T foo ();
T bar ();
};
template <>
struct C<int> {
int foo ();
int bar () {return 4;}
};
template <typename T>
T C<T> :: foo () {return 0;}
template <typename T>
T C<T> :: bar () {return 1;}
int C<int> :: foo () {return 2;}
template <>
float C<float> :: bar () {return 3;}
#include <cassert>
int main () {
C<int> i;
C<float> f;
assert (2 == i .foo ());
assert (0 == f .foo ());
assert (4 == i .bar ());
assert (3 == f .bar ());
}
У меня есть специализированные C<int>::foo
и C<float>::bar
, так что учебник не так, GCC выходит за рамки стандарта, или я неправильно понимаю всю ситуацию?
Спасибо.