如何从子类中看到父模板方法?

时间:2014-01-02 11:53:42

标签: c++ templates c++11 clang++

以下是示例代码:

#include <memory>

class A {
  public:
    template <class T> void f(std::unique_ptr<T>, int) {}

  private:
    virtual void f(int) = 0;
};

class B: public A {
  public:
    using A::f;

  private:
    virtual void f(int) override {}
};

int main() {
  std::unique_ptr<float> a;
  B* b = new B;
  b->f(std::move(a), 1);

  return 0;
}

当我用clang ++编译它时,我收到一个错误:

'f' is a private member of 'A'
using A::f;
         ^

如何从f(std::unique_ptr<T>, int)看到模板方法class B


注意:如果虚拟方法A::f(int)被移动到公共区域 - 一切正常。

2 个答案:

答案 0 :(得分:3)

通过为完全不相关的私有虚拟f提供不同的名称。

具有重载功能,其中不同的重载具有不同的访问控制级别既不起作用也不合理。如果函数实际上做同样的事情(或者给定参数可比较),你应该只使用相同的名称,但是将一个公开和一个私有没有意义。

如果您有私有虚拟的公共包装(这很常见,请参阅例如std::basic_streambuf),只需在其中一个上添加合适的前缀/后缀(std::basic_streambuf使用pub公开,但将privimpl_添加到私人虚拟广告通常更有意义。

答案 1 :(得分:0)

您无法使用using,因为using无法区分模板和虚拟f。什么工作是一个简单的转发器:

class B: public A {
public:
  template <class T> void f(std::unique_ptr<T> p, int i)
  {
    A::f<T>(std::move(p),i);
  }

private:
  virtual void f(int) override {}
};