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

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

Другие вопросы по тегам