Я прошу это в качестве продолжения этот вопрос. Предыдущий вопрос был задан почти три года назад, поэтому я хотел бы задать новый вопрос.
Суть этого вопроса, с которым я связан, заключается в том, что ФП попытался запустить следующую строку кода:
find_if(s.begin(), s.end(), isalnum);
на каком-то контейнере s
, Строка кода не скомпилирована, и OP должен был это сделать
find_if(s.begin(), s.end(), ::isalnum);
В принятом ответе говорится, что в locale
а также cctype
библиотеки, и что компилятор испытывает затруднения в устранении неоднозначности между ними, следовательно, ::
оператор разрешения области. Я проверил это, включив только одну из этих библиотек, и у компилятора все еще есть проблемы с устранением неоднозначности. Это почему? Если я включил только одну из этих библиотек, то, очевидно, компилятор не должен «знать» о другой библиотеке, так почему конфликт?
Вторая часть моего вопроса, как ::
оператор скажите нам, какой isalnum
функция, которую мы хотим?
Спасибо
РЕДАКТИРОВАТЬ
Я знаю что ::
оператор говорит нам, что функция / переменная, которую мы хотим, находится в глобальной области видимости, но это все еще не отвечает на мой второй вопрос.
isalnum
от <locale>
определяется в пространстве имен std
, isalnum
от <cctype>
определяется в пространстве имен std
а также глобально, потому что символы из библиотеки C (вероятно, [1]) сделаны доступными в глобальной области видимости. С помощью ::isalnum
запрашивает версию isalnum
из глобальной сферы, а не из namespace std
,
<ctype.h>
тогда символы будут в глобальном масштабе. Для заголовков библиотеки C это почти всегда так cc*
версии тоже, хотя строго это определяется реализацией.
Насколько я понимаю, использование оператора разрешения области видимости (: 🙂 помогает определить область действия вашей программы.
Так что, если у вас было:
Add(); //This is in Global Scope
class Test{
void Add(); //This is in scope of the "Test" class
int useAdd(); { ::Add();}
}
Так что в этом случае useAdd()
Функция ссылается на функцию добавления в глобальной области видимости, а не на функцию добавления в тестовом классе. Если бы вы хотели сослаться на тот, что в тестовом классе, используя оператор разрешения области действия, вы бы поставили Test::Add()
скорее, чем ::Add()
,
В приведенном выше случае может случиться так, что у него была реализована функция «isalnum» как в его текущем классе, так и в глобальной функции, и ему нужно было конкретно обратиться к глобальной функции, а не к функции класса.
РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял вопрос, Андрей ответил на него лучше, чем я.