C++ の文字列を完全に大文字に変換する必要があります。しばらく探していたのですが、1 つの方法を見つけました。
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main()
{
string input;
cin >> input;
transform(input.begin(), input.end(), input.begin(), toupper);
cout << input;
return 0;
}
残念ながらこれは機能せず、次のエラー メッセージが表示されました。
'transform(std::basic_string::iterator, std::basic_string::iterator, std::basic_string::iterator, 'の呼び出しに一致する関数がありません。
他の方法も試しましたが、どれもうまくいきませんでした。これが最もうまくいく方法でした。
私が尋ねているのは、何が間違っているのかということです。私の構文が悪いのか、何かを含める必要があるのか、よくわかりません。
私の情報のほとんどはここから得られました:http://www.cplusplus.com/forum/beginner/75634/(最後の 2 つの投稿)
ベストアンサー1
の前に二重コロンを置く必要がありますtoupper
:
transform(input.begin(), input.end(), input.begin(), ::toupper);
説明:
2 つの異なるtoupper
機能があります。
toupper
::toupper
C に由来するグローバル名前空間 ( でアクセス) にあります。toupper
std
名前空間 ( でアクセス)にはstd::toupper
複数のオーバーロードがあるため、名前だけで単純に参照することはできません。参照するには、特定の関数シグネチャに明示的にキャストする必要がありますが、関数ポインタを取得するためのコードは見苦しいです。static_cast<int (*)(int)>(&std::toupper)
あなたは なのでusing namespace std
、 と書くとtoupper
、 2. が 1. を隠し、名前解決ルールに従って が選択されます。