
デフォルト引数は、関数の宣言部、または定義部の
いずれかで与えることができると思うのですが、
VC6sp6で
+-------------------------------+
class tmp{
int m_x;
public:
tmp(int x);
};
tmp::tmp(int x=0) : m_x(x){}
+-------------------------------+
とすると、「デフォルトコンストラクタがない」と、エラーになります。
(因みにBCC551ではコンパイルできます)
また、デフォルトコンストラクタを追加すると、
「オーバーロード関数の呼び出しが解決できない」というエラーになります。
前者のエラーの原因は、コンパイラ エラー C2512を読めば理解できますし、
後者の言うことも納得できます。
ここで疑問です。
(1) デフォルト引数はどこで与えることができるか?
(2) デフォルトコンストラクタは、ユーザ定義コンストラクタがある場合は、
必ず用意しなければならないか?(エラーc2512)
C++の規格ではどうなっているのでしょうか?
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
手元にあるのはARMの1版なのですが、ご容赦を。
8.2.6
デフォルト引数は宣言時に指定することが可能です。
#コンパイル結果からは、おっしゃるとおり定義時でも有効になりそうなのですが、記述を見つけられませんでした。
12.1
デフォルトコンストラクタは、コンストラクタが何も宣言されてないときにのみ(必要ならば)生成される。
サンプルソースでは、引数ありのコンストラクタが宣言されていますので、デフォルトコンストラクタは生成されません。
しかし、VC6は定義部のデフォルト引数を有効とみなしたらしく、その結果引数なしの関数が存在し、デフォルトコンストラクタを定義すると、引数なしの関数が2つとなり、オーバーロード関数の呼び出し解決ができなくなったようです。
ARMにも、デフォルト引数を得た結果として、デフォルトコンストラクタとなるということを判断するために、コンパイラに賢くなることを求めている、と記述されていますので、やや賢さが足りなくて、混乱しているのではないでしょうか?
BCC551は、定義部のデフォルト引数から、デフォルトコンストラクタ(引数なしのコンストラクタ)が存在すると認識したと予想されます。
No.2
- 回答日時:
> デフォルト引数は、関数の宣言部、または定義部の
> いずれかで与えることができると思うのですが、
違います。
> (1) デフォルト引数はどこで与えることができるか?
それを呼ぶ側が知っていなくてはならないので、宣言部です。
> (2) デフォルトコンストラクタは、ユーザ定義コンストラクタがある場合は、必ず用意しなければならないか?
いいえ。'必要に応じて' です。
デフォルト引数は宣言部で指定する、ということがキモだと思いました。
(2)はアホな質問でした。
インスタンス生成時に、そのインスタンスに対応するコンストラクタがない場合に、C2512のエラーになるということですね。
デフォルトコンストラクタは関係なかったです。
混乱してました。
+-----------------------------+
class tmp{
int m_x;
public :
tmp(int x = 0);
};
tmp::tmp(int x) : m_x(x) { }
+-----------------------------+
が正しい記述ですね。
お二方、返事が遅くなりましたが、
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# const char** p;のとき、free(p)でC4090エラーとなるのはなぜですか 3 2023/03/31 16:28
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
visualstudio C# テキストボッ...
-
DWORDの実際の型は何でしょうか
-
テンプレート関数でコンパイル...
-
C言語 宣言した変数になにも代...
-
分割コンパイル時に構造体....
-
【#define】 defineで定義した...
-
DDVによるメッセージの変更
-
C++/CLIでネイティブの構造体を...
-
スレッドのスケジューリングポ...
-
voidについて
-
C言語のコンパイルエラー
-
C で、a、b、c が16ビット符号...
-
警告 ”値が割り当てられていな...
-
構造体vectorの入れ子のfillの...
-
構造体を生成時にわざわざ初期...
-
プログラムを組んだのにエラー...
-
C言語の課題について
-
512Lや1024L等の「L」について
-
main.c:7:43: warning: implici...
-
LNK2019: 未解決の外部シンボル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
visualstudio C# テキストボッ...
-
long型の定数の末尾にLを付ける...
-
C++のfor文について
-
C++でboolにintの値を代入する...
-
2重定義って??
-
main.c:7:43: warning: implici...
-
typedef enumの使い方を教えて...
-
プログラムの中で別のmainを呼...
-
変数の型を定義しなかった場合...
-
関数の実体定義にヘッダファイ...
-
ハンドルされていない例外が発...
-
構造体の要素すべてに対する四...
-
C言語のコンパイルエラー
-
DLLでLIBファイルが作成されない
-
sshdログの意味
-
DLLのLPSTR 項目の戻り値の取得...
-
enumについて
-
VC6でlong longでエラー?
-
【#define】 defineで定義した...
おすすめ情報