dポイントプレゼントキャンペーン実施中!

次のコードをビルドすると
「error C2512: 'Hoge' : クラス、構造体、共用体に既定のコンストラクタがありません。」
とでるのですが、なぜそのようになるのかわかりません。
環境はVC8、XP sp2 になります。

struct Boo
{int handle_;};

struct Hoge
{ Hoge(Boo&){} };

int main()
{
Boo boo;
Hoge( boo );
}

これは一体どういうことなのでしょうか?
ご教授よろしくお願いします。

A 回答 (6件)

ついでにどうするかというと, 「宣言に見えなければいい」ので, 例えば


・キャストする: (void)Hoge(boo); とか static_cast<void>(Hoge(boo)); など
・捻ってみる: 0, Hoge(boo); など
という方針はあります.
    • good
    • 1

クラスも構造体も同じですが, デフォルトコンストラクタは「ユーザ定義のコンストラクタがない場合」に限りコンパイラが暗黙に提供します>#3.


今の場合はユーザ定義のコンストラクタ Hoge::Hoge(Boo &) があるので, デフォルトコンストラクタを暗黙に定義することはしません. にもかかわらず (図らずも) デフォルトコンストラクタで初期化しようとしたのでエラーになっています.
    • good
    • 1

># 構造体もクラスの宣言と同じように扱われるのは驚きでした。


構造体メンバの宣言部にアクセス指定子を拡張し、コンストラクタやデストラクタなど、色々な拡張を施したしたのが「クラス」ですから、当然、構造体にもコンストラクタやデストラクタが使えます。

共用体も構造体の拡張ですから、共用体にも同様の事が言えます。

構造体、共用体、クラスオブジェクトが「メモリ上で、どのように存在しているか?」を、つまり「メモリ上の実装」を考えれば「どれも同じような物」と気付く筈です。
    • good
    • 0

#1です。


>#2 とても勉強になりました。

>> 「error C2512: 'Hoge' : クラス、構造体、共用体に既定のコンストラクタがありません。 」
私のせいで話が間違った方向に行った気がします。
多分、質問の意図は2重定義になることではなく、なぜコンストラクタがないのか?、ということだったのかもしれません。

structもメンバがpublicなclassとして扱われるが、
classとして宣言した場合と異なり
暗黙のコンストラクタ・デストラクタは定義されない

ってのが質問の答えになるのですかね。
    • good
    • 0

C++ において構造体は (デフォルトの) アクセス指定子がすべて public であるようなクラスです>#1. だからコンストラクタやデストラクタも定義できます (例えば std::pair はコンストラクタをもつ構造体です) し, その気になれば他のクラスや構造体から導出することもできます.


で, このように式文と (かっこが余計についた) 宣言が構文上区別できなくなることがあり, その場合には宣言として扱うことになっています (6.8 Ambiguity resolution). だから, ここでは「Hoge::Hoge(Boo &) を呼び出す式文」としてではなく, 「Hoge 型の変数 boo を宣言する」と解釈しなければなりません.
なお, 同じようにコンストラクタ呼び出しを使って変数を定義しようとすると「関数の宣言」と解釈されることもあります.
    • good
    • 0

試してみました。



Hoge(boo)は、 booを引数にHoge(Boo&)コンストラクタを呼ぶのではなく
Hoge boo; のように Hoge型の boo オブジェクトを構築する意味です。

エラーメッセージを全て読めば
booが二重定義されていると
表示されているはずです。

# 構造体もクラスの宣言と同じように扱われるのは驚きでした。
# コンストラクタもデストラクタも定義してみると、
# ちゃんと機能していたので驚きです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A