2013-02-22 11 views
3

У меня есть код, отправленный мне сегодня, и он использует std :: transform на std :: string, чтобы сделать его строчным. Отправитель был написан и составлен код в Visual Studio 2010:Visual Studio: Глобальное пространство имен имеет приоритет над локальным

using namespace std; 
string test = "TEST"; 
transform(test.begin(), test.end(), test.begin(), tolower); 

Тогда как я собирал его на OSx с GCC и/или Clang, и получил ошибку компиляции, так как она включает в себя пространство имен в число конфликтов.

На самом деле существует куча ответов на вопросы, которые обращаются к глобальному пространству имен с локальным (:: tolower vs std :: tolower), но это касается того факта, что этот фрагмент кода действительно работает на VS.

Вопросы Я хотел бы ответы:

  1. Почему Visual Studio транслируют это?
  2. Почему оно по умолчанию (?) Относится к глобальному пространству имен :: когда std :: должен принимать приоритет?

Примечание: Im использованием GCC 4.2 и Clang (425,0.24 LLVM 3.2svn) на OSx Горный лев

ответ

1

Проблема здесь двоякая. Во-первых, если вы не указали конкретно #include <cctype>, вы можете получить tolower, это макрос, а не функцию (хотя я не знаю, действительно ли это проблема в эти дни и будет ли это нарушать соответствие стандартов.)

Во-вторых, в C++ tolower перегружен. Вы должны выбрать определенную перегрузку использования:

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

Но я не знаю, почему std:: получает перегруженную версию и :: не делает. В любом случае, я рекомендую вам держаться подальше от этих функций C и вместо того, чтобы использовать std::ctype из <locale> заголовка, который обеспечивает лучшее tolower:

http://www.cplusplus.com/reference/locale/ctype

+0

В то время как это отвечает на часть вопроса, его еще интересно чтобы понять, почему VS принимает: tolower раньше (или должен сказать, а не) std :: tolower. Там может быть некоторый поиск аргументов, [link] (http://msdn.microsoft.com/en-us/library/60bx1ys7 (v = vs.90) .aspx). Но я не уверен, поскольку у меня нет экземпляра VS. Обратите внимание, что GCC также имеет зависящий от аргументов поиск, но в этом случае проявляет другое поведение. – hugolm84

 Смежные вопросы

  • Нет связанных вопросов^_^