MSVC ++ позволяет вам однозначно специализировать шаблоны в классе. Например.
class X {
public:
template <typename T> void doStuff(T value);
template <> void doStuff<bool>(bool value) {
// ..do something specific to bool.
}
};
Это прекрасно компилируется в VS, но попытка компилирования в GCC выдаст ошибку, сообщающую, что у вас есть явная специализация в области, не связанной с пространством имен. Решение этой проблемы - просто растянуть специализацию.
class X {
public:
template <typename T> void doStuff(T value);
};
template <> void X::doStuff<bool>(bool value) {
// ..do something specific to bool.
}
GCC верен в этом вопросе, хотя, согласно спецификации, которая гласит, что все явные специализации должны быть в области пространства имен.
Возможно, стоит отметить, что в последнем случае вы должны определить свою специализацию в заголовочном файле, а не в файле реализации, как вы обычно ожидаете. Оба упомянутых компилятора не соответствуют стандарту, который решит эту проблему, а именно ключевому слову export
, объявленному для специализации в файле реализации. Однако эта функция не реализована большинством компиляторов, и есть планы удалить ее из следующей версии спецификации.