0

「CMtoaPlugin::listArnoldNodes()」を取得して文字列の「配列」を返そうとしています

   std::vector<std::string> ArnoldNodes = CMtoaPlugin::listArnoldNodes();
   std::vector<std::string>::iterator it;

   for ( it=ArnoldNodes.begin() ; it < ArnoldNodes.end(); it++ )
   {
      printf("initialize shader %s\n", *it);
   }

しかし、これは私が得るものです、2つのエントリ、それは正しいですが、エントリの内容はそうではありません

アーノルドシェーダーを初期化する†¡/

アーノルドシェーダーを初期化します。

私は何を間違っているのですか

4

4 に答える 4

7

printf(または任意のvarargsメソッド)を使用してstd::stringを出力することはできません。g ++はここで警告を出します:

warning: cannot pass objects of non-POD type ‘struct std::string’ through ‘...’; call will abort at runtime

coutを使用するだけです。

std::cout << "initialize shader " << *it << std::endl;
于 2010-07-30T22:10:52.767 に答える
6

別の可能性は、次のようstd::stringに、に対応するC文字列を出力することです。printf

 printf("initialize shader %s\n", it->c_str());
于 2010-07-30T22:13:56.767 に答える
4

このようにしてみてください:

for (it = ArnoldNodes.begin() ; it != ArnoldNodes.end(); ++it)
{
    std::cout << "initialize shader " << *it << std::endl;
}
  • printfで動作しませんstd::string、あなたは使用するcout(またはそれを渡すit->c_str())必要があります
  • イテレータのforループでは、it != vec.end()(比較ではなく、等しいかどうかをチェックするだけでよいため)を使用++itし、インクリメントする(一部のイテレータではポストインクリメントの効率が低下する可能性があるため)ことをお勧めします。
于 2010-07-30T22:17:26.603 に答える
0

イテレータ範囲全体でforループを実行する場合は、次を使用して実行する必要があります。

for ( it = ArnoldNodes.begin() ; it != ArnoldNodes.end(); it++ )
{ /*...*/ }

違いは、イテレータがコンテナの最後の1つを返すため、比較がでは!=なく行われることです。それは必ずしもより「正しい」とは限りませんが、より慣用的です。<container.end()

于 2010-07-30T22:31:58.097 に答える