- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
尝试编译以下代码时(从原始代码简化而来):
#include <cstdlib>
#include <iostream>
#include <set>
namespace OrbitSets {
class rational;
}
bool operator<(OrbitSets::rational a, OrbitSets::rational b);
namespace OrbitSets {
// Class definition
class rational {
private:
long long numerator;
long long denominator;
public:
rational() {
numerator = 0;
denominator = 1;
}
rational(int a) {
numerator = a;
denominator = 1;
}
friend bool ::operator<(rational a, rational b);
};
}
// Ordering operations
inline bool operator<(OrbitSets::rational a, OrbitSets::rational b) {
return a.numerator * b.denominator < b.numerator * a.denominator;
}
int main() {
const OrbitSets::rational a = 5;
const OrbitSets::rational b = 3;
std::set<OrbitSets::rational> c;
c.insert(a);
if (a < b) return 1;
return 0;
}
gcc 在 c.insert 行提示它找不到 OrbitSets::rational 类的运算符<,并给出以下错误:
/usr/include/c++/5/bits/stl_function.h:387:20: error: no match for ‘operator<’ (operand types are ‘const OrbitSets::rational’ and ‘const OrbitSets::rational’)
{ return __x < __y; }
但是,当注释掉 c.insert(a) 行时,代码会正确编译,即使在两行之后使用相同类型的参数进行了类似的比较也是如此。
我正在使用 g++ 编译它,为什么它不能找到用于 less<..> 模板类的上述运算符,但能够在两行之后找到它以供使用?
最佳答案
当 set::insert
尝试计算表达式 __x < __y
为了比较您的对象,编译器会执行 Argument-Dependent Lookup .
第一步是 Unqualified Name Lookup .由于表达式在 namespace std
中使用, 这个查找找到了几个函数 std::operator<
(正如您在长编译器错误输出中看到的那样),然后就此停止。
然后编译器会找出函数调用的“相关命名空间和类”。由于两个参数具有相同的类类型,因此唯一关联的类是 OrbitSets::rational
唯一关联的命名空间是 OrbitSets
.
由于您的 operator<
位于全局命名空间中,关联的命名空间查找未找到它。
我还不明白为什么规则 [basic.argdep.lookup]/4.2 不适用:
- Any namespace-scope friend functions or friend function templates declared in associated classes are visible within their respective namespaces even if they are not visible during an ordinary lookup.
在我看来,您确实有一个在关联类中声明的 namespace 作用域友元函数,即使它不是第一个声明。但是 g++ 和 clang++ 都给出相同的错误,并且至少其中一个通常是正确的....
你的 (a < b)
表达式不在包含任何其他 operator<
的范围内, 所以 ::operator<
的集合在这种情况下会发现全局 namespace 中的重载,包括您所指的重载。
无论如何,您可以通过移动您的 operator<
来解决这个问题里面namespace
.
OrbitSets
关于c++ - g++ std::set 找不到为类定义的运算符<,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45058073/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!