2016-07-08 15 views
-3

ここで何が間違っているのか分かりません。C++ stringstreamからconst char *を取得

std::stringstream ss("Title"); 
ss << " (" << 100 << ")"; 
const char* window_title = &ss.str().c_str(); 

私はmakeを実行しましたが、それは満足できませんでした。私が理解から

[17%] Building CXX object CMakeFiles/game.dir/src/main.cpp.o 
path: error: cannot take the address of an rvalue of type 'const value_type *' 
     (aka 'const char *') 
      const char* window_title = &ss.str().c_str(); 
            ^~~~~~~~~~~~~~~~~ 
1 error generated. 
make[2]: *** [CMakeFiles/game.dir/src/main.cpp.o] Error 1 
make[1]: *** [CMakeFiles/game.dir/all] Error 2 
make: *** [all] Error 2 

、私はそれに「(100)」という単語「タイトル」とstringstreamを作成し、追加しています。この後、私は文字列、次に "C文字列"を取得しています。これはcharであり、そのポインタをwindow_titleに格納しています。

どういうところが間違っていますか?

+5

スパムタグを使用しないでください! CはC++ではありません! – Olaf

+2

アドレス 'ss.str()を取る必要はありません.c_str();'は既に 'const char *'を返します。 –

+0

ええと、なぜ10kダウンボックスがありますか?私は問題を説明した、私はしませんでしたか? – Lolums

答えて

4

ss.str()は、呼び出し後に破棄される一時オブジェクトを返します。一時オブジェクトのメモリへのポインタは使用しないでください。未定義の動作です。また、c_str()はすでにヌルで終了しているchar配列へのポインタを返します。コンパイラは、単に一時オブジェクトのメモリにアドレスを使用するのではなく、このアドレスへのポインタを取ることを正当な理由で試みていると不平を言っています。この方法でコンパイルして動作させます

std::stringstream ss("Title"); 
ss << " (" << 100 << ")"; 
//Create a string object to avoid using temporary object 
std::string str = ss.str(); 
const char* window_title = str.c_str(); 
+0

ああ、私はこれを理解していますが、リンクされたエラーが発生します:http://pastebin.com/raw/NpbD7FCJ - これは私のせいですか? (環境のために) – Lolums

+0

@Lolumsあなたは ''ヘッダーをインクルードしましたか? – buld0zzr

+0

私は愚かだ。ありがとう! – Lolums

関連する問題