LoginSignup
3
1

More than 3 years have passed since last update.

transform内のtolowerの呼び出し方

Posted at

概要

上記の問題で下記のようなコードを書いた時に出た疑問解消。

#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としているので、localecctypestd::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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1