当前位置: 首页 > 知识库问答 >
问题:

为什么在我声明它时“与‘operator

阎德义
2023-03-14

它适用于我声明的结构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在某个点上尝试(粗略地说)执行


共有3个答案

贺皓
2023-03-14

从今天起,我的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来做同样的事情是一个有争议的话题。:-)

薛烨
2023-03-14

它适用于我声明的结构xy。为什么相同的模式不适用于复杂的

原因是,当你使用类型从命名空间std只,像std::setstd::complex编译器没有理由寻找运算符在任何其他命名空间。

使用struct xy这是不同的,因为运算符与类型一起声明。

同时,现行标准规定:

未指定为浮点数、双精度或长双精度以外的任何类型实例化模板复合物的效果。

所以使用复杂

陆城
2023-03-14

一个选项是编写一个自定义比较函子,并用它实例化集合。

#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”之类的参数,则必须使用一些额外的代码: 你可以创建一个无需你的参