Проблема в том, что функции друзей, определенные внутри классов, подобных классам, не внедряются во вложенное пространство имен.
Принцип, на который вы ссылаетесь, называется "внедрение имен друзей", но этобыл заменен в текущем стандарте C ++ на «ADL» ( Аргумент-зависимый поиск , также называемый Koenig Lookup ).ADL проверяет все пространства имен, связанные с типами параметров функции, для сопоставления функции.
В вашем случае, когда вы вызываете operator>=
в p1 >= p2
(то есть operator>=(p1, p2);
).ADL ищет соответствующую функцию в пространстве имен Point
, но Point
не имеет такой функции.
Если вы наследуете Point
от less_than_comparable
, operator>=
становится частью пространства имен Point
и ADL может найти его здесь.
Вы можете проверить, не происходит ли инъекция имени друга здесь .