- ベストアンサー
C++の規格
デフォルト引数は、関数の宣言部、または定義部の いずれかで与えることができると思うのですが、 VC6sp6で +-------------------------------+ class tmp{ int m_x; public: tmp(int x); }; tmp::tmp(int x=0) : m_x(x){} +-------------------------------+ とすると、「デフォルトコンストラクタがない」と、エラーになります。 (因みにBCC551ではコンパイルできます) また、デフォルトコンストラクタを追加すると、 「オーバーロード関数の呼び出しが解決できない」というエラーになります。 前者のエラーの原因は、コンパイラ エラー C2512を読めば理解できますし、 後者の言うことも納得できます。 ここで疑問です。 (1) デフォルト引数はどこで与えることができるか? (2) デフォルトコンストラクタは、ユーザ定義コンストラクタがある場合は、 必ず用意しなければならないか?(エラーc2512) C++の規格ではどうなっているのでしょうか? よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
その他の回答 (1)
- επιστημη(@episteme)
- ベストアンサー率46% (546/1184)
回答No.2
お礼
デフォルト引数は宣言部で指定する、ということがキモだと思いました。 (2)はアホな質問でした。 インスタンス生成時に、そのインスタンスに対応するコンストラクタがない場合に、C2512のエラーになるということですね。 デフォルトコンストラクタは関係なかったです。 混乱してました。 +-----------------------------+ class tmp{ int m_x; public : tmp(int x = 0); }; tmp::tmp(int x) : m_x(x) { } +-----------------------------+ が正しい記述ですね。 お二方、返事が遅くなりましたが、 ありがとうございました。