tolower vs ::tolower

0

Dzień dobry,
mam pytanko, dlaczego w tej funkcji:

 transform(slowo.begin(), slowo.end(), wyraz.begin(),::tolower);

musi być:

::tolower); 

a jak zrobie:

tolower); 

to się nie kompiluje?
nie rozmiem po co taki znak :: skoro nic przed nie ma.
Z góry dziękuję za pomoc : D

5

Nie kompiluje się, bo masz using namespace std. Z tego powodu kompilator nie wie czy masz na myśli int ::tolower(int) (aka. ::std::tolower(int)) czy ::std::tolower - szablon funkcji. Bez using namespace std możesz ten błąd powtórzyć podając std::tolower jako argument transform.

Możesz tę niejasność również rozwiązać poprzez cast na chciany typ:

transform(slowo.begin(), slowo.end(), wyraz.begin(), static_cast<int(*)(int)>(tolower));

lub przez lambdę:

transform(slowo.begin(), slowo.end(), wyraz.begin(), [](char c){ return tolower(c); });
0

operator:: bez niczego po lewej stronie oznacza wymuszenie wyszukiwania nazwy następującej po prawej stronie operatora w globalnej strefie nazw (nazwa ta może tam być dlatego, że została w niej zadeklarowana, albo "wciągnięta" za pomocą using) co, jak widać, od czasu do czasu się może przydać. ;)

0

czyli rozumiem że są dwie wersje tolower ? i jak nie podam jaką chcę to kompilator wywali błąd tak? Nie rozumiem jeszcze jaka jest ta druga wersja, bo jedna to ::tolower a ta druga w jakiej przestrzeni nazw jest?

Z góry dziękiuje : D

0

ahh ok nie widziałem że ,można w to kliknąć : ) ok dziękuję : D

1 użytkowników online, w tym zalogowanych: 0, gości: 1