2013-07-10 215 views
1

我开发使用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> 

来自编译器的消息是:

error: type/value mismatch at argument 1 in template parameter list for ‘template class ITipos’

客户端代码是:

TipoBase<std::string> * aTipoBase= new Tipo<std::string,float>; 

接口的目的是允许从一个TIPE改造任何类型的,使用上面的声明,因为使用正常尝试(声明一个虚拟接口将明确),该接口将增长,并且它不会是柔性的话 - 它执行从类型的转换(>浮,..,等字符串)的报价方法。

回答

4

你引用一个模板作为参数传递给ITipos,不是一类。 将其更改为:

template<typename Tipoentrada,typename TipoSalida > 
class TipoString : public ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida> 
{ 
    using ITipos<TipoString<Tipoentrada, TipoSalida>,TipoSalida>::mconversionOk; 
    /*...*/ 
};