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") { }
};

このような2つのインスタンスを作成しようとすると:

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とVisualStudioでもこのエラーが発生します。Intelのコンパイラではわかりませんが、他の3つの動作が一貫していることは、それが間違っていて、他の動作が正しいことを示しているようです。

4

2 に答える 2

3

クラスをコピー可能にしたくないとあなたは言います。

また、質問の中で、次のスニペットを機能させたいと言っています。

Child c1;
Child c2(c1);

これらの要件は矛盾しています。

于 2012-03-16T01:55:42.320 に答える
0

親のコピーコンストラクターにアクセスできないようにしながら、子の自動生成されたコピーコンストラクターに依存しています。発生しているように見えるのは、子の自動生成されたコピーコンストラクターが親のコピーコンストラクターを呼び出そうとしていることですが、プライベートであるため呼び出しできません。

コピーコンストラクターを追加したくない場合は、c1を親参照に明示的にキャストする必要があるようです。

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

または、子のコピーコンストラクターを宣言します。

それとは別に、回避策があるとは思いません。

于 2012-03-16T01:33:33.707 に答える