ошибка C2678: двоичный файл «=»: не найден оператор, который принимает левый операнд типа «const Recipe» (или нет приемлемого преобразования) - PullRequest
6 голосов
/ 18 октября 2011

Я пытаюсь отсортировать вектор, который содержит int и строку в каждом элементе. Это вектор типа класса, называемый векторными рецептами. Получив вышеуказанную ошибку, вот мой код:

В моем файле Recipe.h

struct Recipe {
public:
    string get_cname() const
    {
        return chef_name;
    }
private:
    int recipe_id;
    string chef_name;

В моем файле Menu.cpp

void Menu::show() const {
    sort(recipes.begin(), recipes.end(), Sort_by_cname());
}

В моем файле Menu.h

#include <vector>
#include "Recipe.h"
using namespace std;

struct Sort_by_cname 
{
    bool operator()(const Recipe& a, const Recipe& b)
    {
        return a.get_cname() < b.get_cname();
    }
};

class Menu {
public: 
    void show() const;
private
    vector<Recipe> recipes;
};

Что я делаю не так?

Ответы [ 2 ]

7 голосов
/ 18 октября 2011

Menu::show() объявлено const, поэтому внутри него Menu::recipes считается объявленным как std::vector<Recipe> const.

Очевидно, что сортировка std::vector<> изменяет его, поэтому Menu::show() не должно быть const (или Menu::recipes должно быть mutable, но в этом случае это кажется семантически неправильным).

0 голосов
/ 18 октября 2011

Вы пометили свой метод показа как const, который не соответствует действительности, поскольку он изменяет вектор рецептов.Когда я компилирую код, который вы обрисовали в gnu gcc 4.2.1, ошибка связана с дисквалификацией спецификатора const, а не с ошибкой, которую вы опубликовали.

Вы можете пометить свой вектор ключевым словом mutable, но я подозреваю, что это не то, что вы действительно хотите?Помечая вектор как изменяемый, он игнорирует постоянство, которое компилятор обычно обеспечивает в пределах Menu::show() const от вектора, и он изменяется каждый раз, когда вызывается Menu :: show ().Если вы действительно хотите использовать вектор, а не упорядоченный набор, как предлагали другие, вы можете добавить флаг состояния состояния, чтобы ваша программа знала, когда ей следует прибегнуть, или нет.

Следующий код, который у меня есть, компилируется путем изменения вектора на изменяемый, чтобы показать вам разницу, но я все же рекомендую вам не использовать sort из метода const show.

#include <vector>
#include <string>

using namespace std;
struct Recipe {
public:
  string get_cname() const
  {
    return chef_name;
  }
private:
  int recipe_id;
  string chef_name;
};

class Menu {
public:
  void show() const;
private:
  mutable vector<Recipe> recipes;
};

struct Sort_by_cname
{
  bool operator()(const Recipe& a, const Recipe& b)
  {
    return a.get_cname() < b.get_cname();
  }
};

void Menu::show() const {
  sort(recipes.begin(), recipes.end(), Sort_by_cname());
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...