错误C2678:二进制'=':找不到哪个运算符带有'const Recipe'类型的左手操作数(或者没有可接受的转换)

时间:2011-10-17 23:05:51

标签: c++ class sorting vector

我正在尝试对包含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 个答案:

答案 0 :(得分:7)

Menu::show()被声明为const,因此其内部Menu::recipes被视为已声明为std::vector<Recipe> const

显然,对std::vector<>进行排序会使其变异,因此Menu::show()不能是const(或Menu::recipes必须是mutable,但这似乎在语义上不正确这种情况)。

答案 1 :(得分:0)

您已将show方法标记为const,这不正确,因为它正在更改配方向量。当我编译你用gnu gcc 4.2.1概述的代码时,错误特定于取消const限定符,而不是你发布的错误。

您可以使用关键字mutable标记您的向量,但我怀疑这不是您真正想要的?通过标记向量可变,它忽略了编译器通常在向量的Menu::show() const内强制执行的常量,并且每次调用Menu :: show()时它都会被更改。如果你真的想要使用向量,而不是像其他人建议的那样使用有序集,你可以添加一个脏状态标志,让你的程序知道何时应该求助。

以下代码我通过将vector更改为mutable来编译,以显示差异,但我仍然建议您不要使用const show with 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());
}