我正在编写一些c++模板代码,以替换当前源中的if-else条件。在这里,我基于两个条件推导Helper数据类型,1。is建议2。简单或复杂
参见以下模板代码:
template<bool isAdvice, class SH, class CH>
class IfThenElse;
template<class SH, class CH>
class IfThenElse<true, SH, CH>
{
public:
typedef SH Helper;
};
template<class SH, class CH>
class IfThenElse<false, SH, CH>
{
public:
typedef CH Helper;
};
template <bool isAdvice, bool SimpleOrComplex>
class DeriveHelper
{
public:
typedef typename IfThenElse<isAdvice,
IfThenElse<SimpleOrComplex, SimpleHelper, ComplexHelper>::Helper,
IfThenElse<SimpleOrComplex, SimpleNoAdvHelper, ComplexNoAdvHelper>::Helper>::Helper DerivedHelper;
};
然而,在编译时出现此错误:
template.cpp:135: error: type/value mismatch at argument 2 in template parameter list for 'template<bool isTradeAdvice, class SH, class GH> struct IfThenElse'
template.cpp:135: error: expected a type, got 'IfThenElse::Helper'
template.cpp:135: error: type/value mismatch at argument 3 in template parameter list for 'template<bool isTradeAdvice, class SH, class GH> struct IfThenElse'
template.cpp:135: error: expected a type, got 'IfThenElse::Helper'
有人能告诉我原因吗?
您应该为两个模板类型参数IfThenElse
预先设置一个typename
关键字,就像为第一个所做的那样
template <bool isAdvice, bool SimpleOrComplex>
class DeriveHelper
{
public:
typedef typename IfThenElse<isAdvice,
typename IfThenElse<SimpleOrComplex, SimpleHelper, ComplexHelper>::Helper,
^^^^^^^^
typename IfThenElse<SimpleOrComplex, SimpleNoAdvHelper, ComplexNoAdvHelper>::Helper>::Helper DerivedHelper;
^^^^^^^^
};