如何使父类的模板方法在子类中可见?
How to make a parent's template method visible from a child class?
下面是一个示例代码:
#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)
移动到公共部分 - 一切正常。
通过给它起与完全不相关的私有虚拟f
不同的名称。
重载具有不同访问控制级别的重载功能既不起作用也没有意义。只有当函数实际上执行相同(或给定参数的可比性)事情时,才应使用相同的名称,但将一个公共和一个私有化是没有意义的。
如果您在私有虚拟上有一个公共包装器(这很常见,请参阅 std::basic_streambuf
),只需为其中一个添加合适的前缀/后缀(std::basic_streambuf
在公共场合使用pub
,但通常将priv
、impl
或_
添加到私有虚拟中更有意义。
您不能为此使用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 {}
};
相关文章:
- 使用模板参数重载C++方法:如何使其适用于模板的子类?
- 如何使基类从子类调用覆盖函数
- 是否可以使一个类成为两个不同层次结构的子类?
- 我如何使子类返回C 中的不那么通用的Typedef
- 一个人如何将QT(C )UI分为多个小部件子类,并使其显示与同一类中的所有窗口
- 如何使部分模板与子类合作
- 如何使函数返回由子类定义的值?C++
- C++ 使类的成员变量成为子类中的专用化
- 如何使父类的模板方法在子类中可见?
- C++-使指向超类的指针与函数中的子类参数匹配
- 如何使容器成为私有子类的成员
- 无法使子类正常工作
- 如何使这些子类相互作用
- 视觉 C++当我们在基类中使函数成为纯虚拟时,那么在子类中再次使相同的函数虚拟的必要性是什么
- 子类QGraphicsItem使我无法在QGraphicsScene/View上使用itemAt()
- Qt5自定义LineEdit小部件(QLineEdit子类)私有变量使应用程序崩溃
- 如何使一个函数只能由c++中的某些子类调用?
- 如何使子类上的操作符返回子类类型?
- 使子类继承基类的现有实例
- 使typedef成为文件或子类的本地类型