Оператор разрешения области для 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* версии тоже, хотя строго это определяется реализацией.

3

Другие решения

Насколько я понимаю, использование оператора разрешения области видимости (: 🙂 помогает определить область действия вашей программы.

Так что, если у вас было:

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» как в его текущем классе, так и в глобальной функции, и ему нужно было конкретно обратиться к глобальной функции, а не к функции класса.

РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял вопрос, Андрей ответил на него лучше, чем я.

0

По вопросам рекламы [email protected]