Оператор разрешения области для isalnum
Я спрашиваю это как продолжение этого вопроса. Предыдущий вопрос был задан почти три года назад, поэтому я хотел бы задать новый вопрос.
Суть этого вопроса, с которым я связан, заключается в том, что ФП попытался выполнить следующую строку кода:
find_if(s.begin(), s.end(), isalnum);
на каком-то контейнере s
, Строка кода не скомпилирована, и OP должен был сделать это
find_if(s.begin(), s.end(), ::isalnum);
В принятом ответе говорится, что в locale
а также cctype
библиотеки, и что компилятор испытывает затруднения в устранении неоднозначности между ними, следовательно, ::
оператор разрешения области. Я проверил это, включив только одну из этих библиотек, и у компилятора все еще есть проблемы с устранением неоднозначности. Это почему? Если я включил только одну из этих библиотек, то, очевидно, компилятор не должен "знать" о другой библиотеке, так почему конфликт?
Вторая часть моего вопроса, как это ::
оператор скажите нам, какой isalnum
функция, которую мы хотим?
Спасибо
РЕДАКТИРОВАТЬ
Я знаю что ::
оператор говорит нам, что функция / переменная, которую мы хотим, находится в глобальной области видимости, но это все еще не отвечает на мой второй вопрос.
2 ответа
isalnum
от <locale>
определяется в пространстве имен std
, isalnum
от <cctype>
определяется в пространстве имен std
и глобально, потому что символы из библиотеки C (вероятно, [1]) сделаны доступными в глобальной области видимости. С помощью ::isalnum
запрашивает версию isalnum
из глобальной сферы, а не из namespace std
,
[1]. Стандарт гарантирует, что если вы включите <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" как в его текущем классе, так и в глобальной функции, и ему нужно было конкретно обратиться к глобальной функции, а не к функции класса.
РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял вопрос, Андрей ответил на него лучше, чем я.