我正在尝试对包含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;
};
我做错了什么?
答案 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());
}