【问题标题】:Errors when creating set创建集合时出错
【发布时间】:2012-11-14 18:54:12
【问题描述】:

我想知道为什么我无法创建集合。 我收到以下错误

这是我的代码。

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]

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

【问题讨论】:

标签: c++ set


【解决方案1】:

没有将布尔值作为第二个参数的std::set::insert 重载。你可以这样插入:

s_p2.insert(tempp2);

您的operator&lt; 也可以改进,方法是使其成为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 派生的类型,这很重要。

【讨论】:

  • 按照你的想法我得到这个错误/usr/include/c++/4.6/bits/stl_function.h:236:22:错误:将'const Point2D'作为'this'参数传递' bool Point2D::operator
  • @user1571494,在答案(和另一个)中建议将其设为const 成员。
  • @user1571494 您需要将比较运算符设为 const 方法或非成员函数。比较改变它的论点是没有意义的。
【解决方案2】:
  • 插入仅需要 1 个参数(在您的情况下)
  • Point::operator&lt; 应该是一个 const 成员函数,并以一个 const Point 作为参数(可能是一个 const 引用)
  • 您无需指定less&lt;Point&gt;(在您的情况下)

【讨论】:

  • 按照您的想法,我现在收到此错误 /usr/include/c++/4.6/bits/stl_function.h:236:22: error: 将 'const Point2D' 作为 'this' 参数传递'bool Point2D::operator
  • getScalarValue() const 成员函数吗?
  • 查看编辑后的代码和错误。我不能通过两个agruments
  • 比较运算符是非成员函数bool operator&lt;(const Point&amp; lhs, const Point&amp; rhs); 或成员函数class Point { bool operator&lt;(const POint&amp; rhs) const ; } 此外,您不能使用&gt; 比较实现默认集。它只能是'
  • 您是否已将 getScalarValue() 设为 const 成员函数?此外,如果您将其作为成员函数进行,即使成员是私有的,您也可以直接比较成员,因此您实际上不必调用 getScalarValue()
【解决方案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);

【讨论】:

    【解决方案4】:

    set 中没有insert(),它接受一个元素和bool。只需s_p2.insert(tempp2);

    【讨论】:

      【解决方案5】:

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

      它符合并无错误地运行。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多