Подтвердить что ты не робот

Специализация функции шаблона-члена в шаблоном классе

У меня есть шаблонный шаблон с шаблонизированной функцией-членом

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, если я хочу специализировать функцию, правильно? Я не хочу этого делать, я хочу, чтобы тип внешнего класса был открыт...

Является ли окончательный ответ: это невозможно? Или есть способ?

4b9b3361

Ответ 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; }
};

Простой и легкий:)