C ++ - Оператор вставки, const Ключевое слово вызывает ошибку компилятора - PullRequest
1 голос
/ 08 апреля 2011

Итак, я строю класс, для простоты я его здесь просто ошарашу.

Это дает ошибку компилятора: «Ошибка: объект имеет спецификаторы типа, которые не совместимы с функцией-членом. "

Это код:

ostream& operator<<(ostream& out, const Foo& f)
{
    for (int i = 0; i < f.size(); i++)
        out << f.at(i) << ", ";

    out << endl;
    return out;
}

функции at (int i) возвращает значение из массива с индексом i.

Если я удаляю constКлючевое слово от Foo, все отлично работает.Почему?

РЕДАКТИРОВАТЬ: По запросу, объявления для функций-членов.

.h

public:
    int size(void);
    int at(int);

.cpp

  int Foo::size()
    {
       return _size; //_size is a private int to keep track size of an array.
    }

    int Foo::at(int i)
    {
       return data[i]; //where data is an array, in this case of ints
    }

Ответы [ 2 ]

9 голосов
/ 08 апреля 2011

Вам необходимо объявить вашу функцию "at" и вашу функцию "size" как const, иначе они не могут воздействовать на объекты const.

Итак, ваша функция может выглядеть примерно так:

int Foo::at(int i)
{
     // whatever
}

И это должно выглядеть так:

int Foo::at(int i) const
{
     // whatever
}
0 голосов
/ 08 апреля 2011

Вы вызываете функцию, которая изменяет объект на постоянном объекте.Вы должны убедиться, что функция at не изменяет объект класса Foo, объявив его как const (или удалите const в параметре, чтобы at делал все, что делает, еслидействительно нужно изменить некоторые внутренние данные в Foo).

...