【问题标题】:"Const" incompatible type qualifier issue/problem in C++C++ 中的“const”不兼容类型限定符问题/问题
【发布时间】:2021-12-26 22:39:59
【问题描述】:
Point Point::add(Point& a,Point& b) {
    Point result {};
    size_t length {std::max(a._vector.size(),b._vector.size())};
    for(size_t i {1};i<=length;++i) {
        result._vector.push_back(a.get(i)+b.get(i));
    }
    return std::move(result);
}

上面的代码工作正常,但是将签名更改为

Point Point::add(const Point& a,const Point& b)

给我(编译错误)

E1086   the object has type qualifiers that are not compatible with the member function "Point::get"
object type is: const Point

注意:float Point::get(const size_t&amp; component) 不会修改任何内容。

请帮帮我。
谢谢。

【问题讨论】:

  • 你没有在你的问题中显示的是float Point::get(const size_t&amp; component)是否实际上是float Point::get(const size_t&amp; component) const,如果它没有改变任何东西,它应该是,所以它可以在一个const对象上使用。
  • @Supreeto "上面的代码" 不能正常工作。:)
  • 正如@stefaanv 所说,您需要在Point::get() 方法声明的末尾添加const
  • 问题不在于方法是否修改了任何东西,而在于是否声明了const
  • const 正确性是从一开始就很容易做到的事情之一,但如果拖欠清理起来可能会很麻烦。

标签: c++ class constants overloading function-declaration


【解决方案1】:

函数不能正常工作,因为在这段代码中是sn-p

size_t length {std::max(a._vector.size(),b._vector.size())};
for(size_t i {1};i<=length;++i) {
    result._vector.push_back(a.get(i)+b.get(i));
}

即使向量具有相同的大小,也可以访问向量之外的内存。

至于错误信息,很明显成员函数get不是常量成员函数,因此可能不会为常量对象调用。

需要重载或重新声明当前声明的函数如

float get(const size_t& component);

至少以下方式

float get(const size_t& component) const;

虽然将函数参数声明为具有常量引用类型似乎没有多大意义。你可以像这样声明函数

float get( size_t component ) const;

注意,按如下方式重载函数会更好

float & get( size_t component );
const float & get( size_t component ) const;

【讨论】:

  • 您实际上不需要重载get 方法,因此它既是const 又是非const。只有const 版本更有意义;编译器会将其用于const 和非const 对象。
猜你喜欢
  • 2011-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
相关资源
最近更新 更多