Путаница в пространстве имен C ++ - std :: vs :: vs нет префикса при вызове tolower? - PullRequest
5 голосов
/ 12 июля 2011

Почему это?

transform(theWord.begin(), theWord.end(), theWord.begin(), std::tolower); - не работает transform(theWord.begin(), theWord.end(), theWord.begin(), tolower); - не работает

но

transform(theWord.begin(), theWord.end(), theWord.begin(), ::tolower); - работает

theord - строка. Я using namespace std;

Почему он работает с префиксом ::, а не с std:: или ни с чем?

спасибо за вашу помощь.

1 Ответ

16 голосов
/ 12 июля 2011

using namespace std; указывает компилятору искать недекорированные имена (т. Е. Имена без :: s) в std, а также в корневом пространстве имен. Теперь tolower, который вы просматриваете, является частью библиотеки C и, следовательно, находится в корневом пространстве имен, которое всегда находится в пути поиска, но на него также можно явно ссылаться с помощью ::tolower.

Существует также std::tolower, который принимает два параметра. Когда у вас есть using namespace std; и вы пытаетесь использовать tolower, компилятор не знает, что вы имеете в виду, и поэтому «становится ошибкой».

Таким образом, вам нужно использовать ::tolower, чтобы указать, что вы хотите использовать его в корневом пространстве имен.

Это, кстати, пример того, почему using namespace std; может быть плохой идеей. В std достаточно случайных вещей (а C ++ 0x добавляет больше!), Что вполне вероятно, что могут возникнуть конфликты имен. Я бы порекомендовал вам не использовать using namespace std;, а использовать явно, например. using std::transform; конкретно.

...