Специализация функции шаблона-члена в шаблоном классе
У меня есть шаблонный шаблон с шаблонизированной функцией-членом
template<class T>
class A {
public:
template<class CT>
CT function();
};
Теперь я хочу специализировать функцию шаблона-члена двумя способами. Сначала для того же типа, что и класс:
template<class T>
template<> // Line gcc gives an error for, see below
T A<T>::function<T>() {
return (T)0.0;
}
Второй для типа bool:
template<class T>
template<>
bool A<T>::function<bool>() {
return false;
}
Вот как я пытаюсь его протестировать:
int main() {
A<double> a;
bool b = a.function<bool>();
double d = a.function<double>();
}
Теперь gcc дает мне строку, отмеченную выше:
error: invalid explicit specialization before ‘>’ token
error: enclosing class templates are not explicitly specialize
Итак, gcc говорит мне, что мне нужно специализировать A, если я хочу специализировать функцию, правильно?
Я не хочу этого делать, я хочу, чтобы тип внешнего класса был открыт...
Является ли окончательный ответ: это невозможно? Или есть способ?
Ответы
Ответ 1
Да, это проблема:
error: enclosing class templates are not explicitly specialized
Вы не можете специализировать участника без специализации класса.
То, что вы можете сделать, помещает код из function
в отдельный класс и специализируется на том, что, как и basic_string, зависит от отдельного класса char_traits. Затем неспециализированный function
может вызвать помощника в классе признаков.
Ответ 2
Вы можете использовать перегрузку, если вы измените реализацию.
template <typename T>
class Foo
{
public:
template <typename CT>
CT function() { return helper((CT*)0); }
private:
template <typename CT>
CT helper(CT*);
T helper(T*) { return (T)0.0; }
bool helper(bool*) { return false; }
};
Простой и легкий:)