2011-10-28 7 views
0

この質問にはGoogle検索がありますが、私の人生にとっては無関係の何百万もの回答を得られないとは思いません。 "このような"g ++とMSVCのC++引用の意味

ので、引用符の内側MSVCテキストで

はSTD ::文字列または、多分、のstd ::文字列&として、私が思うに、取られます。 g ++/gccでは常にconst char *と見なされます。本当ですか?

私は私がプレイしたいコードスニペットを発見し、それが

if(NULL == key) 
    throw exception("Empty key"); 

が含まれていますが、私は

を得るMSVC/VC++(2008(私はグラム上でそれを試し++(4.4.3)でうまくコンパイル
no matching functions for calls to std::exception::exception(const char&) 

私はこれが動作するようになった:

if (NULL == key) 
{ 
    std::string estr ("Empty key"); 
    throw exception("Empty key"); 
} 

をしかし、それは単なる醜いです

これは私に別のエラーを得た:

std::string estr (""); 
if (NULL == key) 
{ 
    estr = "Empty key"; 
    throw exception("Empty key"); 
} 

私は()は、その入力として期待するものは例外見当もつかない。私はstd :: stringかstd :: string &を提案した何かを見つけましたが、私はそのページを失いました。それ以来私が見つけた何百万もの役に立たないページは無用です。例外クラス、例外の使用に関するすべての種類の情報があります。

g ++に "これはstd :: string"であると伝える簡単な方法がありますか?&まだVC++を幸せに保ちますか? (明らかに私は、単一のソースからのクロスコンパイルコードをやろうとしている。)

そして、そのことについては、どのようにID

throw exception("Empty key"); 

throw "Empty key"; 

おかげで、

ウェス異なります

+1

例外をスローします(新しいstd :: string( "Empty key"))。 –

+2

@DrewBurchett: 'exception'にはデフォルト以外のコンストラクタはありませんので、メモリリークの作成が良いアイデアだったとしても動作しません。 –

+0

@MikeSeymour:OK、多分私は誤解しています。コンパイラは例外がstd :: stringを期待していることを彼に伝えていませんか?もしそうなら、例外をスローしてstd :: stringを渡すと、コントロールは決して例外を越えて返されることはないので、破壊されるでしょうか? –

答えて

3

文字列リテラルの型は常にcharの配列で、リテラル内にヌルターミネータを含む文字を入れるのに十分なサイズです。従って"Empty key"のタイプはchar[10]です。必要に応じて暗黙的にchar const *またはstd::stringに変換することができます。

exceptionは例外タイプの基本クラスであり、直接インスタンス化するものではありません。 std::runtime_error(文字列を使用して構築できる)のような<stdexcept>で定義された型の1つを投げたり、std::exceptionを継承し、what()を継承する独自の型を定義する必要があります。

私は、Microsoftが非標準コンストラクタをstd::exceptionに追加したと推測しています。彼らは奇妙な方法で言語を拡張するのが好きです。

+0

標準的なコンストラクタを追加することは、Microsoftにとってはまったく合法です。特に、標準ライブラリの他の例外の基本型として使用されるためです。これらは標準ライブラリの実装の一部であるため、これらの例外は基本クラスの実装固有のメソッドを使用する場合があります。実装固有の基本クラスを使用するのも一般的です。 – MSalters

+0

@MSalters:もちろん、それは合法です。私が望むなら誰かがそれを公にする合理的な正当性を思い付くことができると確信しています。移植性の観点からは(この質問が示すように)悪い考えです。 –

+0

偉大な答え!どうもありがとう。 –

2

std :: exceptionは基本クラスです。

代わりにstd :: runtime_errorをスローしてみてください。

2

std::stringで例外をスローすることは避けてください。それ自体が例外をスローする可能性があります。その場合、未定義の動作が発生します。

スロー標準例外はstd::exceptionクラスから派生し、it.Andは例外の適切な説明を追加するwhat()メソッドをオーバーライド投げる<stdexcept>で定義されているか、独自の例外クラスを持っています。

また、値では常にthrow、参考としてcatchである。

0

"like this"は、標準に従ってconst charの配列とみなされます。これはここでは問題ではありません。実際には、std::exceptionにはデフォルトのコンストラクターしかなく、もう一度標準に従っています。テキスト文字列を取るコンストラクタを追加するのが普通ですが、このコンストラクタはVC++とg ++で異なって動作します。

私はここに、G ++のドキュメントを持っていないけど、それはように、その非標準のコンストラクタを定義するようなあなたの例から、それが見えます:VC++のような非標準のコンストラクタを定義しながら

explicit exception(const std::string&);

explicit exception(const char*);

+0

文字列リテラルは、ポインタではなく配列です。 –

+0

@MikeSeymour:あなたは正しいです、訂正されました。 – Gorpik

関連する問題