'this' аргумент функции-члена 'select' имеет тип 'const SelectParam', но функция не помечена как const - PullRequest
0 голосов
/ 31 мая 2019

Я пытаюсь вызвать функцию для полиморфного элемента. Но я получаю следующее сообщение об ошибке во время компиляции:

'this' аргумент функции-члена 'select' имеет тип 'const SelectParam', но функция не помечена const

ошибка отображается при выборе p-> (* 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.

Ответы [ 2 ]

1 голос
/ 31 мая 2019

Действительно, вы не можете вызвать не 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;

И ваш код тоже должен работать.

0 голосов
/ 31 мая 2019

Вам необходимо явно указать компилятору, что ваша функция не будет изменять какие-либо члены:

bool const select(Tuple const & tup) const {
...