2

オブジェクト a3 を使用して「explicit a (string x)」を呼び出すことができません。次のような 2 つのコンパイル エラーが発生しました。

[エラー] 'const char*' から 'int' への無効な変換 [-fpermissive]

[エラー] 'a::a(int)' の引数 1 を初期化中 [-fpermissive]

私の予想される出力は 'int int double string'; です。

誰かがこれらのエラーを削除するのを手伝ってくれませんか? 貴重な時間をありがとう。

#include<iostream>
#include<string.h>

using namespace std; 


struct a{

    a(int x=0){cout<<" int ";
    }
    inline a (double x){cout<<" double ";
    }
    explicit a (string x){ cout<<" string ";
    }

};


int main()
{
    a a0(NULL);
    a a1=9;
    a a2=1.1;
    a a3=("Widf"); //Error
}
4

2 に答える 2

3

構文的には、C++ は解釈します

a a3 = ("Widf");

「式を評価し、それと等しいように初期化された、呼び出された"Widf"型のオブジェクトを構築します。」has typeであるため、C++ は暗黙的な変換コンストラクターが利用可能な場合にのみ初期化できます。constructor を明示的にマークしたため、この暗黙的な変換は使用できないため、エラーが発生します。aa3"Widf"const char[4]a3"Widf"explicit

これを修正するには、行を次のように書き換えてみてください。

a a3("Widf");

これは最初に評価しようとはしません"Widf"が、代わりにパラメーターとしてコンストラクターに直接渡します。

お役に立てれば!

于 2013-02-24T07:17:48.400 に答える
2

明示的なコンストラクターは、構造体/クラス名を介して呼び出す必要があります。

a("Widf")

等式をコンストラクターとして使用することは、明示的なコンストラクター呼び出しではありません。これを使用できます:

a a3 = a("Widf")

どちらが:

  1. 一時オブジェクトを作成します
  2. コピー コンストラクターを使用して a3 を作成する

ただし、コンパイラ オプティマイザはこれを最適化できるはずです。

または、単に書くことができます

a a3("Widf")
于 2013-02-24T07:18:59.113 に答える