我正在使用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>
来自编译器的消息是:
错误:模板参数列表中参数1的类型/值不匹配 '模板类ITipos'
客户端代码是:
TipoBase<std::string> * aTipoBase= new Tipo<std::string,float>;
接口的意图是允许使用上述声明从tipe转换为任何类型,因为使用正常尝试(声明虚拟接口将明确提供从类型执行转换的方法(string - &gt; float) ,...等)),界面会增长,根本不会灵活。
答案 0 :(得分:4)
您将模板引用为ITipos
的参数,而不是类。
将其更改为:
template<typename Tipoentrada,typename TipoSalida >
class TipoString : public ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>
{
using ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>::mconversionOk;
/*...*/
};