我正在使用 STL 开发一个简单的配置器类,但我遇到了一个问题,这是基类中实现 CRTP 以避免虚拟接口声明的代码:
template<typename Tipo, typename Salida >
class ITipos{
public:
Salida & convertir()
{
Salida aTipoSalida= static_cast<Tipo *>(this)->convertir_imp();
return aTipoSalida;
}
protected:
bool mconversionOk;
};
template<typename Tipoentrada,typename TipoSalida >
class TipoString : public ITipos<TipoString,TipoSalida>
{
using ITipos<TipoString,TipoSalida>::mconversionOk;
public:
TipoString()
{
mconversionOk=false;
}
TipoSalida & convertir_imp()
{
TipoSalida aTipoSalida;
return aTipoSalida;
}
}
问题出在 TipoString 类的声明中,编译器不喜欢这个声明:
template<typename Tipoentrada,typename TipoSalida >
class TipoString : public ITipos<TipoString,TipoSalida>
来自编译器的消息是:
错误:“模板类 ITipos”的模板参数列表中参数 1 的类型/值不匹配</p>
客户端代码为:
TipoBase<std::string> * aTipoBase= new Tipo<std::string,float>;
接口的目的是允许使用上述声明从一个类型转换为任何类型,因为使用正常的尝试(声明一个虚拟接口将显式提供执行类型转换的方法(字符串 -> 浮点数,..,等)),界面会变大,而且一点也不灵活。