错误 C2678:二进制 '=' :未找到采用“const Recipe”类型的左操作数的运算符; (或者没有可接受的转换)

发布于 2024-12-10 04:10:55 字数 775 浏览 0 评论 0原文

我正在尝试对每个元素中包含一个 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;
};

我做错了什么?

I'm trying to sort a vector that contains an int and a string in each element. It is a vector of class type called vector recipes. Getting the above error, here's my code:

In my Recipe.h file

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

In my Menu.cpp file

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

In my Menu.h file

#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;
};

What am I doing wrong?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

追我者格杀勿论 2024-12-17 04:10:55

Menu::show() 被声明为 const,因此在其内部 Menu::recipes 被认为已被声明为 std ::矢量<食谱>常量。

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

Menu::show() is declared const, so inside of it Menu::recipes is considered to have been declared as std::vector<Recipe> const.

Obviously, sorting a std::vector<> mutates it, so Menu::show() must not be const (or Menu::recipes must be mutable, but this seems semantically incorrect in this case).

停顿的约定 2024-12-17 04:10:55

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

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

我通过将向量更改为可变来编译以下代码,以向您展示差异,但我仍然建议您不要将 sort from 与 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());
}

You have marked your show method as const which isn't true because it is changing the recipes vector. When I compile the code you have outlined with gnu gcc 4.2.1 the error is specific to disqualifying the const qualifier, not the error you've posted.

You could mark your vector with the keyword mutable but I suspect that isn't what you really want? By marking the vector mutable it ignores the constness the compiler would normally enforce within Menu::show() const of the vector and it gets changed everytime Menu::show() is called. If you really want to use the vector, and not an ordered set like others have suggested, you could add a dirty state flag to let your program know when it should resort, or not.

The following code I have compiles by changing the vector to mutable to show you the difference, but I still recommend that you don't use sort from with a const show method.

#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());
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文