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]

这是因为我有两个比较陈述吗?

4

5 回答 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();
}

这具有与 LHS 和 RHS 完全对称的优点。如果您有隐式转换Point或从Point.

于 2012-11-14T08:50:34.330 回答
4
  • 插入只需要1个参数(在你的情况下)
  • Point::operator<应该是一个 const 成员函数并以一个 const Point 作为参数(可能是一个 const 引用)
  • 您无需指定less<Point>(在您的情况下)
于 2012-11-14T08:51:29.867 回答
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_typePoint. 你用Point, bool. 这些都不匹配。你觉得这个true参数有什么作用?

只需将其称为

s_p2.insert(tempp2);
于 2012-11-14T08:50:01.623 回答
0

设法解决它。我还需要让我的 getScalarValue() 常量。因为它只返回值。

它符合并运行没有错误。

于 2012-11-14T09:47:45.363 回答
0

没有insert()in setwhich 需要一个元素 and bool。做吧s_p2.insert(tempp2);

于 2012-11-14T08:51:05.243 回答