C++ 11のコンストラクタ継承機能を使用しようとしています。 (私はそこを覚えていないどこかからコピーされた)次のスニペットは、完全に正常に動作します:コピーコンストラクタを削除すると、継承されたコンストラクタが破損する
コメントでマークされた行が追加されるまで、ある#include <iostream>
struct Base {
Base() : Base(0) {}
Base(int a) : Base(a, 0) {}
Base(int a, double b) { std::cout << "Base(" << a << "," << b << ")" << std::endl; }
};
struct Derived : Base {
using Base::Base;
Derived(const Derived& that) = delete; // This line is the culprit
};
int main(int argc, char* argv[]) {
Derived d1;
Derived d2(42);
Derived d3(42, 3.14);
}
。その後、すべての地獄の休憩が緩いので:
> g++ -std=c++11 -o test test.cpp
test.cpp: In function ‘int main(int, char**)’:
test.cpp:18:11: error: no matching function for call to ‘Derived::Derived()’
Derived d1;
^
test.cpp:18:11: note: candidates are:
test.cpp:13:16: note: Derived::Derived(int)
using Base::Base;
^
test.cpp:13:16: note: candidate expects 1 argument, 0 provided
test.cpp:13:16: note: Derived::Derived(int, double)
test.cpp:13:16: note: candidate expects 2 arguments, 0 provided
コピーコンストラクタを削除するも何とかアクセスできないBase
からデフォルトコンストラクタを作ったかのように思われます。問題を調べても何も役に立たなかった。 SOはthis issueを提案しましたが、わかっている限り、私はこのスニペットでコピー初期化を使用しません。誰かがここで何が起こったのかについていくつかの光を当てることができましたか?
(上記のメッセージを生成し、コンパイラがGCC 4.8.2である。しかし、打ち鳴らすは、同様のエラーメッセージを返す)
デフォルトコンストラクタは継承されません。 –
T.C.どうして? 'Derived d1;'行では、 'Base()'がはっきりとわかります。 –
@ T.C。言葉の選択は誤解を招く。もちろん、コンストラクタは継承されます。そうでなければ、派生クラスからそれらを呼び出すことはできません。それはちょうど異なるクラスに使用されました。 – SergeyA