它适用于我声明的结构xy。为什么相同的模式不适用于复杂的
#include <complex>
#include <set>
using namespace std;
struct xy {
int x, y;
};
bool operator< (const xy &a, const xy &b) {
return a.x < b.x;
}
bool operator< (const complex<int> &a, const complex<int> &b) {
return a.real() < b.real();
}
int main() {
xy q;
set<xy> s;
s.insert(q);
complex<int> p;
set< complex<int> > t; //If I comment out these two lines,
t.insert(p); //it compiles fine.
return 0;
}
错误消息:
In file included from c:\m\lib\gcc\mingw32\4.8.1\include\c++\string:48:0, from c:\m\lib\gcc\mingw32\4.8.1\include\c++\bits\locale_classes.h:40, from c:\m\lib\gcc\mingw32\4.8.1\include\c++\bits\ios_base.h:41, from c:\m\lib\gcc\mingw32\4.8.1\include\c++\ios:42, from c:\m\lib\gcc\mingw32\4.8.1\include\c++\istream:38, from c:\m\lib\gcc\mingw32\4.8.1\include\c++\sstream:38, from c:\m\lib\gcc\mingw32\4.8.1\include\c++\complex:45, from test.cpp:1: c:\m\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_function.h: In instantiation of 'bool less<>::operator()(const _Tp&, const _Tp&) const': c:\m\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_tree.h:1321:11: required from 'pair<> _Rb_tree<>::_M_get_insert_unique_pos(const key_type&)' c:\m\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_tree.h:1374:47: required from 'pair<> _Rb_tree<>::_M_insert_unique(_Arg&&)' c:\m\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_set.h:463:29: required from 'pair<> __cxx1998::set<>::insert(const value_type&)' c:\m\lib\gcc\mingw32\4.8.1\include\c++\debug\set.h:220:59: required from 'pair<> __debug::set<>::insert(const value_type&)' test.cpp:28:19: required from here c:\m\lib\gcc\mingw32\4.8.1\include\c++\bits\stl_function.h:235:20: error: no match for 'operator<' (operand types are 'const std::complex<int>' and 'const std::complex<int>') { return __x < __y; }
我最好的猜测是这与复杂有关
我看到的是STL在某个点上尝试(粗略地说)执行
从今天起,我的Ubuntu的g面临着这个问题。假设我有:
namespace X { namespace Y { class C { ... }; } }
现在操作符==
如果在全局命名空间中定义,则可以识别,例如:
bool operator== (const X::Y::C& lhs, const X::Y::C& rhs) { return lhs == rhs; }
然而,不知何故,编译器无法识别运算符
现在,以下方法效果良好:
namespace X { namespace Y {
bool operator< (const C& lhs, const C& rhs) { return lhs < rhs; } } }
但是,您是否应该使用扩展标准
命名空间std
来做同样的事情是一个有争议的话题。:-)
它适用于我声明的结构xy。为什么相同的模式不适用于复杂的
原因是,当你使用类型从命名空间std只,像std::set
和std::complex
,编译器没有理由寻找运算符在任何其他命名空间。
使用struct xy
这是不同的,因为运算符与类型一起声明。
同时,现行标准规定:
未指定为浮点数、双精度或长双精度以外的任何类型实例化模板复合物的效果。
所以使用复杂
一个选项是编写一个自定义比较函子,并用它实例化集合。
#include <complex>
#include <set>
bool operator< (const std::complex<int> &a, const std::complex<int> &b) {
return a.real() < b.real();
}
struct my_less {
bool operator() (const std::complex<int>& lhs, const std::complex<int>& rhs) const{
return lhs < rhs;
}
};
int main() {
std::complex<int> p;
std::set< std::complex<int>, my_less > t;
t.insert(p);
return 0;
}
Coliru上的样本
本文向大家介绍请解释下为什么我们可以在声明函数前使用它?相关面试题,主要包含被问及请解释下为什么我们可以在声明函数前使用它?时的应答技巧和注意事项,需要的朋友参考一下 js 两个特性, 提升变量声明和函数声明,但是注意一点的是 这个是不叫函数声明的, 变量funcName还是会提升,只不过作为一个undefined的变量, 只有 这个叫函数声明,会被提升
问题内容: 为什么编译器没有在开关中的每个代码块之后自动放置break语句?是出于历史原因吗?您何时要执行多个代码块? 问题答案: 有时将多个案例与同一代码块关联会很有帮助,例如 等。只是一个例子。 以我的经验,通常“摔倒”并在一种情况下执行多个代码块是不好的风格,但是在某些情况下可能会有用处。
问题内容: 我是Python的新手,正在尝试使用tkinter编写程序。为什么执行下面的Hello函数?据我了解,仅在按下按钮时才会执行回调?我很困扰… 问题答案: 在为其Button分配参数时调用它: 如果要传递函数(不是返回值),则应改为: 通常是一个函数对象,就是函数返回的结果。看看这是否有帮助: 如果要传递参数,则可以使用lambda表达式构造无参数可调用对象。 简而言之,因为它位于lam
问题内容: 对我的头衔表示歉意,我无法正确表达问题。 我已经看到有两种实现方式。首先通过表示您的类已实现来完成。第二个任务是让您自己声明完成任务。 为什么在第一种选择中,您可以简单地将其作为参数,而在第二种选择中,则必须麻烦自己创建对象? 首先: 第二: 问题答案: 在第一种方法中, 整个Activity类都 实现了该接口。您可以将每个View的设置 为此 ,并通过一种方法接收所有click事件,
问题内容: 该主题充分说明了这一点-为什么不能在接口中声明静态方法的原因是什么? 上面的代码给了我以下错误(至少在Eclipse中):“接口方法ITest.test()的非法修饰符;仅允许public&abstract”。 问题答案: 这里有一些问题。第一个问题是声明静态方法而不定义它的问题。这是之间的区别 和 由于Espo提到的原因,第一个是不可能的:你不知道哪个实现类是正确的定义。 Java
问题内容: 代码是: 该按钮不起作用,它在没有我的命令的情况下打印了“hey”和“ het”一次,然后,当我按下按钮时,什么也没发生。 问题答案: 考虑以下代码: 它的功能与此完全相同: 该选项引用了一个函数,这是你需要向其传递函数名称的一种奇特的方式。要传递引用,你必须仅使用名称,而不使用括号或参数。例如: 如果要传递诸如“her”之类的参数,则必须使用一些额外的代码: 你可以创建一个无需你的参