2

sタイプにヌル終了文字列が格納されていますchar*istringstreamからオブジェクトを作成したいs。のコンストラクターはistringstreamtype のパラメーターを想定しているため、 からにstring変換する必要があります。これを行うには、次の方法でコンストラクターを使用して匿名オブジェクトを作成しました。schar*stringstrings

istringstream strin(string(s));

これは、gcc (4.7.3) を使用してコンパイルした場合は問題ないようです。ただし、使用する次のコードを追加した後strin

int r;
strin >> r;

コンパイルエラーが発生しました:

error: invalid operands of types 'std::istringstream(std::string*) {aka std::basic_istringstream<char>(std::basic_string<char>*)}' and 'int' to binary 'operator>>'

タイプが何であるかを理解していないので、これは奇妙に思えstd::istringstream(std::string*)ます。strinタイプであってはいけませんstd::istringstreamか?

次のコードの修正バージョンのいずれかを使用することで、コンパイラを満足させることができます。

解決策 1: 名前付きstringオブジェクトを渡す

string str(s);
istringstream strin(str);

解決策 2: を直接渡すsと、暗黙的に に変換されるようですstring

istringstream strin(s);

解決策 3: 明示的に変換sするstring

istringstream strin((string)(s));

解決策 4: 一対の魔法のかっこを追加する

istringstream strin((string(s)));

解決策 5: コンパイラsが実際にchar*型であることを伝える

istringstream strin(string((char*)s));

元のものを除いて、これはすべて機能します。ここで実際に何が起こっているのか、誰か説明できますか? ありがとう。

4

2 に答える 2

4

最も厄介な解析が再び発生します。

std::istringstream strin( string( s ) );

を引数として取り、 を返す関数 ( strin) を宣言します。(このような関数を実装する方法はないため、優れたコンパイラはここで警告を発します。) これを修正する最も簡単な方法は、括弧をいくつか追加することです。stringstd::istringstream

std::stringstream strin( (string( s )) );

(実際、ここでの最も簡単な解決策は、次のように書くことです:

std::stringstream strin( s );

暗黙の変換に任せてください。)

于 2013-08-12T08:31:38.567 に答える
1

これは「最も厄介な解析」の問題です。

istringstream strin(string(s));

これはstrin変数宣言ではなく、 を受け取りstring、 を返す関数の宣言istringstreamですstrin

このケースをこのように修正できます。そこに注目してください+。whilesは識別子、+sは式です。

istringstream strin(string(+s));
于 2013-08-12T08:35:18.440 に答える