Родовая функция лица, не являющегося членом какой-либо организации, должна только быть объявлена в пространстве имен, которое не является связанным пространством имен
Родовая функция лица, не являющегося членом какой-либо организации, должна только быть объявлена в пространстве имен, которое не является связанным пространством имен.
Это правило запрещает помещающие родовые функции в том же пространстве имен как класс (struct) тип, перечислимый тип или описания типа объединения. Если класс, перечисление или типы объединения используются в качестве параметров шаблона, присутствие родовых функций в том же пространстве имен может вызвать неожиданные разрешения вызова. Поместите родовые функции только в пространства имен, которые не могут быть сопоставлены с классом, перечислением или типом объединения.
Считайте пространство имен NS
это комбинирует класс B
и типовая форма operator==
:
namespace NS { class B {}; template <typename T> bool operator==(T, std::int32_t); }
B
как параметр шаблона для другого типового класса, такого как этот шаблонный класс A
:template <typename T> class A { public: bool operator==(std::int64_t); } template class A<NS::B>;
NS
используется для разрешения перегрузки когда операторы класса A
называются. Например, если вы вызываете operator==
с int32_t
аргумент, типовой operator==
в пространстве имен NS
с int32_t
параметр используется вместо operator==
в исходном шаблонном классе A
с int64_t
параметр. Вы или другой разработчик или рецензент кода можете ожидать, что вызов оператора решит к operator==
в исходном шаблонном классе A
.Для каждой родовой функции средство проверки правила определяет, содержит ли содержание пространства имен также объявления типов классов, перечислимых типов или типов объединения. Если такое объявление найдено, средство проверки отмечает нарушение правила на самом операторе.
Средство проверки также отмечает родовые функции, заданные в глобальном пространстве имен, если глобальное пространство имен также имеет класс, перечисление или объявления объединения.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: шаблоны |
Категория: необходимый |