template<typename T> class VeryBigClass { public: // предполагается, что здесть ещё куча фукнций double one( int ) {}; // ... // и ещё одна нешаблонная функция, которую будем определять void f(); }; // реализация для общего случая template<typename T> void VeryBigClass<T>::f() { std::cout << "generic" << std::endl; } // реализация для типа long template<> void VeryBigClass<long>::f() { std::cout << "long" << std::endl; }
Стандарт разрешает это несмотря на то, что фукнция f() сама по себе не шаблонная. Это разрешается пунктом стандарта C++'03 14.7/3 и ещё есть хороший пример в 14.5.2/2.
Разработчики бывает думают, что код выше невозможен, вероятно, из-за того, что таким способом невозможно написать частичную специализацию класса. Т.е. мы не можем написать функуцию VeryBigClass<T>::f() и ещё одну VeryBigClass<T*>::f() не продублировав определение весего класса ещё раз (либо разбив его на части).