以下是示例代码:
#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)
被移动到公共区域 - 一切正常。
答案 0 :(得分:3)
通过为完全不相关的私有虚拟f
提供不同的名称。
具有重载功能,其中不同的重载具有不同的访问控制级别既不起作用也不合理。如果函数实际上做同样的事情(或者给定参数可比较),你应该只使用相同的名称,但是将一个公开和一个私有没有意义。
如果您有私有虚拟的公共包装(这很常见,请参阅例如std::basic_streambuf
),只需在其中一个上添加合适的前缀/后缀(std::basic_streambuf
使用pub
公开,但将priv
,impl
或_
添加到私人虚拟广告通常更有意义。
答案 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 {}
};