我正在尝试实现如下的模板化类。
struct Ciccio2 : public T1, public T2, public T3, public T4
{
template<typename TR>
int get(const string& s) const
{
return TR::operator()(s);
}
};
所有模板化参数都类似于以下示例类
struct AA{
int operator()(const string& s) { return 1;}
};
我也尝试使用全局提取器函数,但是当我使用g ++下面的模板函数时,我会发现构建错误
template<class TA, class T1, class T2, class T3, class T4>
int extract(const Ciccio2<T1,T2,T3,T4>& obj, const string& s)
{
return obj.get<TA>(s);
}
下面的代码并不夸张说
expected primary expression before > token
我想要实现的是正确的吗?
答案 0 :(得分:1)
由于obj
是依赖于类型的表达式,因此编译器不会使用名称查找来确定obj.get
是对象,函数,类型还是模板。除非您强制执行其他操作,否则编译器会假定它是语法分析的对象或函数。接下来它会看到<
小于运算符(而不是<
开始模板参数列表),之后很快就会感到困惑。你需要:
return obj.template get<TA>(s);
另见问题Where and why do I have to put the template and typename keywords?
答案 1 :(得分:0)
除非TR
是T1
,T2
,T3
和T4
之一,否则该行:
return TR::operator()(s);
应该是:
return TR().operator()(s);
或
return TR()(s);
由于operator()
不能是静态成员函数。