【发布时间】:2012-03-16 01:25:24
【问题描述】:
我有一个类层次结构,可以这样简单地说:
struct Parent {
Parent() { }
Parent(Parent& p, std::string s) { }
private:
// I want this class to be non-copyable
Parent(const Parent&);
};
struct Child : public Parent {
Child() { }
Child(Parent& p) : Parent(p, "hi") { }
};
当我尝试像这样创建两个实例时:
Child c1;
Child c2(c1);
我从 Clang 收到以下错误:
test.cpp:37:8: error: call to deleted constructor of 'Child'
Child c2(c1);
^ ~~
test.cpp:30:8: note: function has been explicitly marked deleted here
struct Child : public Parent {
^
1 error generated.
我希望这个类是不可复制的,那么有没有办法调用 Parent& 重载而不是复制构造函数?我知道它为什么会这样,但我正在寻找一种解决方法。我想调用 Child(Parent& p) 而不必强制转换它。
我在 GCC 和 Visual Studio 中也收到此错误。虽然我不明白英特尔的编译器,但其他三个的一致行为似乎表明它是错误的,其他的都是正确的。
【问题讨论】:
-
那么您是在寻求解决方法还是为什么它不起作用?
-
@ildjarn 我知道它为什么不起作用,我需要一个解决方法。抱歉,我将对其进行编辑以使其更清楚。
-
在传递 cv 限定的
Child&时,根本无法创建一个比复制构造函数具有更高重载优先级的构造函数。您需要进行强制转换、类型擦除、工厂函数而不是公共构造函数或静态多态。
标签: c++ copy-constructor class-hierarchy