创建集合时出现错误

3
我希望能够了解为什么我无法创建一个集合。 我得到了以下错误提示。
这是我的代码。
Point.cpp 我的点类。
bool Point::operator<(const Point& p2)const {
return p21.length < p2.getScalarValue();
}

bool Point::operator>(const Point p2) {
bool result;
result = length > p2.getScalarValue();
return result;

在我的main.cpp文件中

set<Point> s_p2;
Point tempp2;
s_p2.insert(tempp2);

在遵循您的指导后,我已经编辑了代码,但出现了以下错误:

Point.cpp:56:46: 错误:将“const Point”作为“double Point :: getScalarValue()”的“this”参数传递会丢弃限定符[-fpermissive]

这是因为我有两个比较语句吗?


true 代表什么意思?http://en.cppreference.com/w/cpp/container/set/insert - chris
试试这个:http://www.cplusplus.com/reference/stl/set/insert/ - Maroun
@chris 我认为,我需要为比较给出一个值。 - M.A
@user1571494,您提供的 operator< 是用来处理所有比较的。 - chris
@chris,根据专家的意见,我进行了编辑,但现在出现了不同的错误。你能帮忙吗? - M.A
5个回答

5

没有一个以bool作为第二个参数的std::set::insert重载。您可以这样插入:

s_p2.insert(tempp2);

您的operator<也可以改进,将其设置为const方法,并采用const引用参数:

class Point {
  // as before
  bool operator<(const Point& p) const;
};  //                            ^ here, const method

bool Point::operator<(const Point& p2) const {
  return length < p2.length;
}

您也可以选择将其作为非成员函数:

bool operator<(const Point& lhs, const Point& rhs) {
  return lhs.getScalarValue() < rhs.getScalarValue();
}

这样做的好处在于完全对称于左手边和右手边。如果你有到 Point 或从 Point 派生的类型的隐式转换,则这一点很重要。


在按照您的想法操作后,我遇到了以下错误:/usr/include/c++/4.6/bits/stl_function.h:236:22: error: passing ‘const Point2D’ as ‘this’ argument of ‘bool Point2D::operator<(Point2D)’ discards qualifiers [-fpermissive] - M.A
1
@user1571494,建议在答案(和其他答案)中将其设置为“const”成员。 - chris
@user1571494,你需要将比较运算符设置为const方法或非成员函数。比较不应该改变其参数,这是没有意义的。 - juanchopanza

4
  • 在您的情况下,插入(Insert)只需要一个参数。
  • Point :: operator< 应该是一个常量成员函数,并且将一个常量点作为参数(可能是一个常量引用)。
  • 在您的情况下,您不需要指定 less<Point>

在遵循您的想法后,我现在出现了错误 /usr/include/c++/4.6/bits/stl_function.h:236:22: 错误:将“const Point2D”传递为“bool Point2D::operator<(Point2D)”的“this”参数会丢弃限定符[-fpermissive]。 - M.A
1
getScalarValue()是一个const成员函数吗? - 0x26res
请查看已编辑的代码和错误。为什么我不能传递两个参数? - M.A
比较运算符可以是非成员函数 bool operator<(const Point& lhs, const Point& rhs); 或者成员函数 class Point { bool operator<(const POint& rhs) const ; }。同时,你不能使用 > 进行默认集合的实现,只能使用 < - 0x26res
如果我按照成员函数并且只有一个参数进行跟踪,那么我会得到以下错误:Point.cpp:56:46: error: passing ‘const Point2D’ as ‘this’ argument of ‘double Point::getScalarValue()’ discards qualifiers [-fpermissive] - M.A
1
你把 getScalarValue() 做成了 const 成员函数吗?另外,如果你将其作为成员函数,则可以直接比较成员变量,即使它们是私有的,因此你实际上不必调用 getScallarValue()。 - 0x26res

3

insert的签名之一为:

std::pair<iterator,bool> insert( const value_type& value );
(1) 
std::pair<iterator, bool> insert( value_type&& value );
(2) (since C++11)
iterator insert( iterator hint, const value_type& value );
iterator insert( const_iterator hint, const value_type& value );
(3) (until C++11) 
(since C++11)
iterator insert( const_iterator hint, value_type&& value );
(4) (since C++11)
template< class InputIt >
void insert( InputIt first, InputIt last );
(5) 
void insert( std::initializer_list<value_type> ilist );
(6) (since C++11)

value_type翻译为Point。你正在使用Point, bool进行调用,但它们都不匹配。你认为true参数是干什么的?

只需按以下方式调用:

s_p2.insert(tempp2);

0

set 中没有接受元素和 boolinsert() 方法。只需使用 s_p2.insert(tempp2);


0

问题已解决。我需要将我的getScalarValue() const函数也加上,因为它只返回值。

现在代码编译并运行没有错误。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接