1

我有一个类层次结构,可以简单地这样说:

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 中也遇到了这个错误。虽然我不明白英特尔的编译器,但其他三个的一致行为似乎表明它是错误的,而其他的则是正确的。

4

2 回答 2

3

你说你不希望你的类是可复制的。

您还在您的问题中说您希望以下代码段起作用:

Child c1;
Child c2(c1);

这些要求是矛盾的。

于 2012-03-16T01:55:42.320 回答
0

您依赖于 Child 的自动生成的复制构造函数,同时使父级的复制构造函数无法访问。似乎正在发生的事情是 Child 的自动生成的复制构造函数试图调用父级的复制构造函数,但它不能,因为它是私有的。

如果您不想添加复制构造函数,看起来您需要将 c1 显式转换为父引用:

Child c2(static_cast<Parent&>(c1));

或为 Child 声明复制构造函数。

除此之外,我不相信有解决方法。

于 2012-03-16T01:33:33.707 回答