成员函数'select'的'this'参数类型为'const SelectParam',但函数未标记为const

时间:2019-05-31 01:14:41

标签: c++ compiler-errors polymorphism

我正在尝试在多态项上调用函数。但是我在编译时收到以下错误消息:

  成员函数'this'的

'select'自变量类型为'const SelectParam',但函数未标记为const

该错误显示在p-> selection(* it)

        std::set<Tuple>::iterator it;
        for (it = tuples.begin(); it != tuples.end();) {
            for (const SelectParam* p: selectionParams) {
                bool successful = p->select(*it);
                if( !successful ) {
                    it = tuples.erase(it);
                } else {
                    it++;
                }
            }
        }

,这是定义这些类的方式。 (我以前并没有所有的const和&,但我将它们放在任何地方都希望可以做任何想要的const,但显然我没有正确地解决问题,因为它没有改变任何东西。

在存储在父指针处的子类之一中。

    bool const select(Tuple const & tup) {
        bool matched = false;
        if (tup[idx] == val) {
            matched = true;
        }
        return matched;
    }

在另一个用于多态的子类中

    bool const select(Tuple const & tup) {
        bool matched = false;
        if (tup[idx1] == tup[idx2]) {
            matched = true;
        }
        return matched;
    }

最后是超级简单的父类。

class SelectParam {
    public:
    virtual const bool select( Tuple const & t) = 0;
};
``
Thanks in advance for being willing to help my feeble brain.

3 个答案:

答案 0 :(得分:1)

实际上,您不能将非const方法称为const对象。但是,您也不能通过指针或对const对象的引用调用非const方法(无论所引用的对象是const还是不是)。

这意味着:

const SelectParam* ptr = whatever();
ptr->select(someTuple);

格式错误。

在您的情况下,您已在此行上声明了一个指向const SelectParam的指针:

for (const SelectParam* p: selectionParams) {

只需删除const,它就可以工作了:-)

另一方面,如果select绝不打算修改对象,则只需将其标记为const:

virtual const bool select( Tuple const & t) const = 0;

您的代码也应该工作。

答案 1 :(得分:0)

您需要明确告知编译器您的函数将不会修改任何成员:

bool const select(Tuple const & tup) const {

答案 2 :(得分:0)

声明为 const 的对象不能被 constnon-const 成员函数更改(构造函数和析构函数除外)。即使它是通过引用传递的。此规则有两个例外:

  1. 可以抛弃 constness(抛弃 const),但通常不建议这样做。
  2. 可以使用 mutable 关键字声明类成员。即使将包含对象声明为 const,也可以通过成员函数更改这些成员。

可以阅读更多here

<块引用>

const 对象 - 类型为 const 限定的对象,或 const 对象的非可变子对象。此类对象不能被修改:直接尝试这样做是编译时错误,并且尝试间接这样做(例如,通过引用或指向非常量类型的指针修改 const 对象)会导致未定义的行为。

正如其他人评论的那样,一种解决方案是在成员函数的声明定义中向成员函数添加 const 关键字。这样,即使在 const 对象上也可以调用该函数。

this 是怎么回事?

在成员函数中,this 是指向函数在 [see] 上调用的当前对象的指针。