Я пишу класс, в котором я хочу создать специализацию шаблона функции-члена, как это
namespace aha
{
class Foo
{
public:
template < typename T >
T To() const
{
// some code here
}
};
template <>
bool Foo::To < bool > () const
{
// some other code here
}
}
GCC выдает ошибку:
Явная реализация ‘To < bool> ‘после создания
Я хотел бы сделать это с помощью шаблонной специализации функций-членов только для того, чтобы пользователи моей библиотеки получали ту же функцию при конвертации. Foo
для разных типов данных, таких как
Foo obj;
bool b( obj.To < std::string > () );
int i( obj.To < int > () );
float f( obj.To < float > () );
и так далее.
Пожалуйста, дайте мне знать, что я делаю неправильно в коде.
Явная реализация ‘To < bool> ‘после создания
Вышесказанное говорит само за себя: оно становится специализированным после того, как его общая версия уже используется.
Специализация шаблона функции может быть смоделирована с перегрузкой, которая является более гибким механизмом (например, нет частичной специализации для шаблонов функций, но можно достичь желаемого эффекта с перегрузкой):
template<class T> struct Type {}; // similar to boost::type<>
class Foo
{
template<class T>
T doTo(Type<T>) const; // the generic version
bool doTo(Type<bool>) const; // an overload for bool only
// add more overloads as you please
public:
template < typename T >
T To() const {
return this->doTo(Type<T>());
}
};
Других решений пока нет …