1

整数をstd::stringに変換するこの関数があります:

std::string intToStr(const int n) {
    stringstream ss;
    ss << n;
    return ss.str();
}

これまではうまく機能していましたが、std :: pairに入れる文字列を作成しようとしていますが、問題が発生しています。

整数変数hpと整数を返す関数が与えられた場合int maxHP()、次のような文字列を作成します( 5の"5/10"場合は10を返します)。hpmaxHP

これが私の試みです:

string ratio = intToStr(hp) + "/" + intToStr(maxHP());
return pair<string, OtherType>(ratio, someOtherType); 

g ++でコンパイルすると、次のエラーで失敗します。

src/Stats.cpp:231: error: no matching function for call to  
‘std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
TCODColor>::pair(<unresolved overloaded function type>, const TCODColor&)’
/usr/include/c++/4.4/bits/stl_pair.h:92: note: candidates are: std::pair<_T1,
_T2>::pair(std::pair<_T1, _T2>&&) [with _T1 = std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, _T2 = TCODColor]
/usr/include/c++/4.4/bits/stl_pair.h:83: note:                 std::pair<_T1,
_T2>::pair(const _T1&, const _T2&) [with _T1 = std::basic_string<char, 
std::char_traits<char>, std::allocator<char> >, _T2 = TCODColor]
/usr/include/c++/4.4/bits/stl_pair.h:79: note:                 std::pair<_T1, 
_T2>::pair() [with _T1 = std::basic_string<char, std::char_traits<char>,
std::allocator<char> >, _T2 = TCODColor]
/usr/include/c++/4.4/bits/stl_pair.h:68: note: 
std::pair<std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
TCODColor>::pair(const std::pair<std::basic_string<char, std::char_traits<char>,
std::allocator<char> >, TCODColor>&)

だからstd::pairは私の文字列が好きではありません。OtherType正常にコンパイルされる別のペアコンストラクターがあるため、問題が発生していないことを確認しました。

pair<string, OtherType>("astring", someOtherType);

誰かが私がこれを修正する方法を見ますか?


答えは奇妙でしたが、それを修正しました。私の問題は、どういうわけか比率が定義されていないということでしたが、g++はそれについて教えてくれませんでした。make_pairGManが提案したようにコードを変更すると、突然それがわかりました。なぜそれが起こるのか誰もが知っていますか?

関数の詳細は次のとおりです。

if(verbose) 
    string ratio = intToStr(hp) + "/" + intToStr(maxHP());

if(div > 1.0f) {
    if(verbose) return pair<string, OtherType>(ratio, someOtherType); // doesn't compile
    else return pair<string, OtherType("astring", someOtherType); // compiles
}

修正されたコードは次のとおりです。

string ratio = intToStr(hp) + "/" + intToStr(maxHP());

if(div > 1.0f) {
    if(verbose) return make_pair(ratio, someOtherType); // compiles now
    else return make_pair("astring", someOtherType); // compiles
}
4

3 に答える 3

4

これが失敗する理由:

if(verbose) 
    string ratio = intToStr(hp) + "/" + intToStr(maxHP());

// the block of the if is now over, so any variables defined in it
// are no longer in scope

変数のスコープは、変数が定義されているブロックに制限されているということです。

于 2010-07-22T22:25:37.327 に答える
1

コードを修正する方法は次のとおりです。

if (div > 1.0f)
{
    string str = verbose ? intToStr(hp) + "/" + intToStr(maxHP()) : "astring";
    return make_pair(str, someOtherType); 
}

もう少し簡潔。また、フォーマットをもう少し一般的にすることもできます。

于 2010-07-22T22:36:02.827 に答える
0

問題のようconstです。エラーで報告されている過負荷を見てください。

  • pair(std::pair<_T1, _T2>&&)
  • pair(const _T1&, const _T2&)

したがって、パラメータを期待しているように見えconstます。

于 2010-07-22T21:59:50.793 に答える