概要
上記の問題で下記のようなコードを書いた時に出た疑問解消。
# include<bits/stdc++.h>
# define rep(i,n) for(int i = 0; i < (n); i++)
using namespace std;
int main(){
string s;
cin>>s;
transform(s.begin(), s.end(), s.begin(), tolower);
s[0]=toupper(s[0]);
cout<<s<<endl;
return 0;
}
起きた疑問
transform(s.begin(), s.end(), s.begin(), tolower);
上記の箇所で下記のようなコンパイルエラーが発生する。
cannot determine which instance of overloaded function "tolower" is intended
になるが、下記のように修正すると通る。
transform(s.begin(), s.end(), s.begin(), ::tolower);
この時呼ばれているtolower
は実際何なのかについて調べたので復習の意味で記す。
結論
結論から言うと::
をつけた時に呼ばれるtolowerはこちらのtolowerである。
グローバルなscopeにあるtolower
が呼ばれている。
エラーになる理由
using namespace std
としているので、locale
とcctype
のstd::tolower
がデフォルトスコープに含まれてしまっており、tolower
とした時にどの関数を呼ぶべきかが一意に判別できずにエラーとなっている。
::
をつけることでグローバルスコープにあるtolowerを一意に識別できている、というふうに動いているようだ。
参考URL
https://stackoverflow.com/questions/5539249/why-cant-transforms-begin-s-end-s-begin-tolower-be-complied-successfu
https://stackoverflow.com/questions/5270780/what-does-the-mean-in-tolower
https://qiita.com/_EnumHack/items/430da105a541f9ecd774
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q11170167721