c-为什么我必须限制重载的模板基类方法?

我似乎无法在不限制基类范围的情况下调用基类的方法,这似乎是因为我已经重载了该方法.如果我不重载该方法,则编译器不会抱怨.这是我想做的事的一个例子:

struct BaseClass {                                                           
  template <typename T> T& foo(T& t) {                               
    return t;                                                                
  }                                                                          
};                                                                           

class ChildClass: public BaseClass {                                         
  public:
  // The presence of this template causes compiler confusion                                                            
  template <class T> T& foo(T& t, int szl) {                        
    return t;                                                                
  }                                                                          

  template <class T> int bar(T& t) {                 
    // But if I scope this as BaseClass::foo(...) it's all good                        
    return foo(t);                                                
  }                                                                          
};                                                                           

int main() {                                                                 
  int t = 1;                                                                 
  ChildClass c;                                                              
  c.bar(t);                                        
}

如果在bar(…)中我调用BaseClass :: foo(…),编译器不会抱怨,但是我在这里看不到任何歧义,因此我对为何需要执行此操作感到困惑.

解决方法:

当编译器尝试将函数名称与函数进行匹配时,它将分两步进行.在第一步中,它将找到与给定名称匹配的所有功能.如果找到多个功能,它将尝试重载解析的逻辑以找到最佳匹配功能.

第一步,如果编译器在类中找到一个名称,它将停止在基类中寻找相同名称的函数.在您的情况下,由于它在ChildClass中找到一个foo,因此它将停止在BaseClass中搜索名为foo的函数.但是,唯一匹配的foo与调用不匹配,并且编译器报告错误.

如何解决问题:

>使用您在帖子中描述的方法.调用BaseClass :: foo(…).
>将BaseClass中的所有foo都带入ChildClass的范围.

class ChildClass: public BaseClass {
  public:

  using  BaseClass::foo;

  template <class T> T& foo(int baz, T& t, int szl) {
     return t;
  }

  template <class T> int bar(T& t) {
    return sizeof(foo(1, t)); // Should work.
  }
};
上一篇:十:jinja2模板查找路径


下一篇:当我安装“ Smarty” php时,需要锁定文件夹template和templates_r以便公共访问吗?