2012-02-03 5 views
0

私はremoveInelligibleCharsFromTargetNameと呼ばれる新しい関数を持っています。関数は文字列の単一の文字の比較を許可しません - C++

error C2678: binary '==' : no operator found which takes a left-hand operand of type 'std::string' (or there is no acceptable conversion) 32> c:\program files\microsoft sdks\windows\v6.0a\include\guiddef.h(192): could be 'int operator ==(const GUID &,const GUID &)' while trying to match the argument list '(std::string, char)'

しかし、それを正確に同じネストされたループバック、私はそれを呼び出すところに置く代わりに、関数を呼び出す:

void removeInelligibleCharsFromTargetName(string *targetName) 
{ 
    for(int i = 0; i < targetName->length(); i++) 
    { 
     for(int j = 0; j < ineligibleChars.length(); j++) 
     { 
      if(targetName[i] == ineligibleChars[j]) 
       targetName[i] = '_'; 
     } 
    } 
} 

問題は、私がもしループで比較してみたときに、私は次のエラーを取得するです正常に動作します。

誰かがホエイに関数では動作しませんが、関数外ではうまく動作すると伝えることができますか?間違いなくそれがポインタであることについては何かが、私は何を知っているのですか?

答えて

5

なぜポインタをstringに渡していますか?それは本当に悪い考えです。参照を渡します。

void removeInelligibleCharsFromTargetName(string& targetName) 
{ 
    for(int i = 0; i < targetName.length(); i++) 
    { 
     for(int j = 0; j < ineligibleChars.length(); j++) 
     { 
      if(targetName[i] == ineligibleChars[j]) 
       targetName[i] = '_'; 
     } 
    } 
} 

問題は、あなたがポインタを持っているとき、targetName[i]*(targetName+i)と同じであるということです。 これは、文字列の配列へのインデックス付けに相当します。文字列の配列がない場合、これは未定義の動作につながります。コードがコンパイルされず(文字列と文字を比較できない)、コンパイラがエラーをキャッチしたことは幸運でした。コンパイルが行われた場合、実行したときにはおそらく非常に奇妙な動作が見られます。

stringまたはその参照先を指定すると、targetName[i]は文字列にoperator[]を呼び出します。これは文字列にインデックスを付けて実際に文字を与えます。

+0

私はあなたがバグに気づいたと思います:)。 –

+0

私は本当に知りません。その遅い金曜日の夜は私が持っているすべてです....... ありがとう – discodowney

0

targetName[i]の出現をすべて(*targetName)[i]に変更してください。または、R. Martinho Fernandesが指針ではなく参照を提案して渡すようにしてください。

0

それは(へのポインタ)配列されていたようtargetNameは、ポインタ、このコードポインタからインデックスへ

if(targetName[i] == ineligibleChars[j]) 
    targetName[i] = '_'; 

試みです​​。実際に指している文字列にアクセスするには、文字列にインデックスを付ける前にポインタを間接参照する必要があります。

if((*targetName)[i] == ineligibleChars[j]) 
    (*targetName)[i] = '_';