0

我正在尝试实现如下所示的模板类。

   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

我正在尝试实施的内容是否正确?

4

2 回答 2

1

由于obj是一个依赖于类型的表达式,编译器不会使用名称查找来确定obj.get是对象、函数、类型还是模板。除非您强制它这样做,否则编译器会假定它是用于语法分析的对象或函数。接下来它看到了<小于运算符(不是<模板参数列表的开头),很快就会感到困惑。你需要:

return obj.template get<TA>(s);

另请参阅问题在哪里以及为什么必须放置模板和类型名称关键字?

于 2014-06-23T18:26:42.510 回答
0

除非TR是 、 、 和 之一T1T2T3T4

   return TR::operator()(s);

应该:

   return TR().operator()(s);

或者

   return TR()(s);

因为operator()不能是静态成员函数。

于 2014-06-23T18:51:26.700 回答