2

この署名を持つメソッドがあります

void SetFoo(QString& foo);

空の文字列をインラインで渡そうとしていますが、次のコンパイルはどれもありません

SetFoo("");
SetFoo(QString(""));

(エラー: 'MyClass::SetFoo(QString)' の呼び出しに一致する関数がありません)

しかし、このような変数を作成すると機能します。

QString emptyFoo = "";
SetFoo(emptyFoo);

変数を明示的に作成せずにメソッドを呼び出す方法はありませんか?

注: vc++ コンパイラを使用する Windows 環境ではすべてが機能するように見えますが、g++ を使用する Linux 環境では上記のコンパイル エラーが発生します。

4

2 に答える 2

5

グローバルオブジェクトをとして作成し、どこでも使用できます-NullObjectPatternconst QString nullStr()にやや似ています。

あるいは、billzが言及しているconstように、一時的なものへの参照が存在する可能性があるため、それを作成するconst Qstring& と最初の2つのバージョンが有効になります

とにかく、参照をconst Qstring&変更する予定がない場合は、への参照を変更する必要があります。

于 2013-01-16T04:57:00.733 に答える
2

参照を一時オブジェクトにバインドするには、const修飾子が必要です。QString コンストラクターがchar*入力を受け取る場合は、次を試してください。

void SetFoo(const QString& foo);

有効期限が切れた変数への参照を SetFoo のみに渡すことは理にかなっています。

void SetFoo(QString& foo);
QString s;
SetFoo(s);

. 注: vc++ コンパイラを使用する Windows 環境ではすべてが機能するように見えますが、g++ を使用する Linux 環境では上記のコンパイル エラーが発生します。

VisualStudio は、その C++ 拡張機能で (良くも悪くも) 有名です。コードが VS でコンパイルされても、それが C++ 標準であるとは限りません。より良い方法は、コードを記述するときにコンパイル警告 (レベル 4) をオンにすることです。これにより、一時オブジェクトへの参照をバインドするための警告が表示されます。
また、C++ 標準を検索し、コンパイラのマニュアルを検索して、コードが移植可能であることを確認してください。

于 2013-01-16T04:55:58.403 に答える