У меня есть код, отправленный мне сегодня, и он использует 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.
Вопросы Я хотел бы ответы:
- Почему Visual Studio транслируют это?
- Почему оно по умолчанию (?) Относится к глобальному пространству имен :: когда std :: должен принимать приоритет?
- Херес ideone фрагмент кода (с ошибками): http://ideone.com/qvUAMw
- Херес ideone фрагмент кода (который работает): http://ideone.com/lk0H5d
Примечание: Im использованием GCC 4.2 и Clang (425,0.24 LLVM 3.2svn) на OSx Горный лев
В то время как это отвечает на часть вопроса, его еще интересно чтобы понять, почему VS принимает: tolower раньше (или должен сказать, а не) std :: tolower. Там может быть некоторый поиск аргументов, [link] (http://msdn.microsoft.com/en-us/library/60bx1ys7 (v = vs.90) .aspx). Но я не уверен, поскольку у меня нет экземпляра VS. Обратите внимание, что GCC также имеет зависящий от аргументов поиск, но в этом случае проявляет другое поведение. – hugolm84