我无法理解此代码中的错误:
#include <set>
#include <utility>
#include <iostream>
using namespace std;
class A
{
public:
A(unsigned int a) : _a(a) { }
A() : _a(0) { }
unsigned int a() const { return _a; }
private:
unsigned int _a;
};
class B
{
public:
B(unsigned int b) : _b(b) { }
B() : _b(0) { }
unsigned int b() const { return _b; }
private:
unsigned int _b;
};
void display(const Point& point)
{
//cout << "A: " << point.first.a() << ", B: " << point.second.b() << endl;
}
typedef pair <A, B> Point;
typedef set <Point> List;
main()
{
A a(5);
B b(9);
List list;
List::iterator it;
Point point;
point = make_pair(a, b);
it = list.begin();
list.insert(point); // <--- error here
//display(point);
}
Run Code Online (Sandbox Code Playgroud)
错误是这样的:
In file included from /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_algobase.h:66,
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_tree.h:62,
from /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/set:60,
from test.cpp:1:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_pair.h: In function ‘bool std::operator<(const std::pair<_T1, _T2>&, const std::pair<_T1, _T2>&) [with _T1 = A, _T2 = B]’:
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_function.h:230: instantiated from ‘bool std::less<_Tp>::operator()(const _Tp&, const _Tp&) const [with _Tp = std::pair<A, B>]’
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_tree.h:1170: instantiated from ‘std::pair<typename std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::iterator, bool> std::_Rb_tree<_Key, _Val, _KeyOfValue, _Compare, _Alloc>::_M_insert_unique(const _Val&) [with _Key = std::pair<A, B>, _Val = std::pair<A, B>, _KeyOfValue = std::_Identity<std::pair<A, B> >, _Compare = std::less<std::pair<A, B> >, _Alloc = std::allocator<std::pair<A, B> >]’
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_set.h:411: instantiated from ‘std::pair<typename std::_Rb_tree<_Key, _Key, std::_Identity<_Key>, _Compare, typename _Alloc::rebind<_Key>::other>::const_iterator, bool> std::set<_Key, _Compare, _Alloc>::insert(const _Key&) [with _Key = std::pair<A, B>, _Compare = std::less<std::pair<A, B> >, _Alloc = std::allocator<std::pair<A, B> >]’
test.cpp:48: instantiated from here
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_pair.h:154: error: no match for ‘operator<’ in ‘__x->std::pair<A, B>::second < __y->std::pair<A, B>::second’
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_pair.h:154: error: no match for ‘operator<’ in ‘__y->std::pair<A, B>::first < __x->std::pair<A, B>::first’
/usr/lib/gcc/x86_64-pc-linux-gnu/4.4.4/include/g++-v4/bits/stl_pair.h:154: error: no match for ‘operator<’ in ‘__x->std::pair<A, B>::first < __y->std::pair<A, B>::first’
Run Code Online (Sandbox Code Playgroud)
Mat*_*lia 11
您正在尝试使用std::set 没有ordering(,而集合需要其元素具有"特定的严格弱排序标准".std::pair)的元素类型
更新:实际上std::pair 确实提供了一个operator<(感谢 @UncleBens)中,在条款限定operator<其组成部分; 所以问题在于你A而B不是提供比较运算符; 你应该写一个operator<forA和B.
换句话说,因为operator<对于点通常没有意义,你可以为你的Points 创建一个比较仿函数,并将其作为第二个模板参数传递给你std::set.
pair并且set是模板,而不是类.你需要这样做:
typedef pair<A, B> Point;
typedef set<Point> List;
Run Code Online (Sandbox Code Playgroud)
模板变成当你实例化它的一类,例如std::set<int> theset;创建类 set<int>从类模板 set.
编辑:正如phooj指出的那样,你需要A和B都有一个比较运算符operator<.见Matteo Italia的答案.
| 归档时间: |
|
| 查看次数: |
32014 次 |
| 最近记录: |