c++ - 为什么我必须确定重载模板基类方法的范围?

标签 c++ templates

我似乎无法在不限定基类范围的情况下调用基类的方法,这似乎是因为我重载了该方法。如果我不重载该方法,那么编译器就不会提示。这是我想做的一个例子:

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不匹配调用,编译器报错。

如何解决问题:

  1. 使用您在帖子中描述的方法。调用 BaseClass::foo(...)

  2. 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.
      }
    };
    

关于c++ - 为什么我必须确定重载模板基类方法的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33717196/

相关文章:

c++ - 存储和调用具有不同签名的成员函数的 unordered_map

drupal - 基于 url 命名 Drupal 7 模板文件

c++ - 模板类的方法取决于模板参数

c++ - union 中的友元函数出现错误 "... does not name a type"- 为什么?怎么修?

c++ - 名称和派生名称类之间的连接(作为模板参数)

c++ - 混合 getter/setter 和普通变量

c++ - 包含在主函数和类主体中会返回多个定义错误

c++ - 使用 QQuickWidget 运行 QtVirtualKeyboard

c++ - Windows 传感器 API - CLSID 的未解析外部符号

c++ - C++ 中的有界类型参数,缺少它的原因是什么?