6

これは非常にばかげた質問かもしれませんが、回答を探すために何を書けばよいかさえわかりません。私が付けたタイトルが正しいかどうかさえわかりません。

次のようなコンストラクタがある場合:

CError(const std::string& msg) { showMessage(msg) }

そして、私はそれをこのように呼びたいです...

CError("some message");

...すべて動作しますが、文字列が変数に指定されている場合、「クラス CError のデフォルト コンストラクターが存在しません」というエラーが発生しました。

std::string str = "some message";
CError(str);

このように書くと、うまくいきます:

std::string str = "some message";
CError err(str);

errしかし、私はこのオブジェクトを必要としません。

コンストラクター自体だけを呼び出せない理由を誰かに説明してもらえますか?

回答ありがとうございます。

4

2 に答える 2

8

この行CError(str);は として解析されCError str;、新しい変数 が定義されますstr。私のコンパイラは別の方法で失敗するため、問題がより明白になります: redefinition of 'str' with a different type.

この問題の簡単な回避策は、オブジェクトをキャストすることです。

(void)CError(str);

しかし、切実な問題は次のとおりです。なぜこれを行うのですか? 構築されたオブジェクトを何らかの方法で使用する予定がない場合は、単純にそれを静的メンバー関数にするか、単純な古い無料関数にするだけでよいでしょうか?

于 2012-11-02T08:52:59.400 に答える
4

このステートメントは、タイプCError(str);のオブジェクトを定義するものとして読み取られます。と同等ですが、名前が括弧で囲まれています。strCErrorCError str;str

これを回避するには、型名も括弧で囲みます: (CError)(str);. これにより、ステートメントが機能キャスト式として読み取られるようになります。(CError) str;またはと同等に書くこともできますstatic_cast<CError>(str);

C++11 では、ユニバーサル初期化構文を使用してCError{str};.

于 2012-11-02T08:57:49.070 に答える