首页 > 解决方案 > CPP:使用已删除功能

问题描述

我正在尝试struct使用 c++ 中的 lambda 函数对包含自定义条目的向量进行排序。但我收到以下错误消息提示

错误:使用已删除的函数 'dummy_struct& dummy_struct::operator=(const dummy_struct&)

代码如下所示:

#include <regex>

struct dummy_struct
{
    dummy_struct(std::string name, int64_t value_a) :
        name(name),
        value_a(value_a)
    {}
    
    const std::string name;
    const int64_t value_a;
    
    int ExtractNumberFromName(std::regex key)
    {
        int retval;
        std::cmatch match;
        std::regex_search(this->name.c_str(),match,key);
        retval=std::stoi(match[0],nullptr);
        return retval;
    }
    
};


void SortByCustomKey(const std::vector<dummy_struct> collection, std::regex key)
{

    auto compare = [key](dummy_struct a, dummy_struct b)
    {
        return a.ExtractNumberFromName(key) > b.ExtractNumberFromName(key)
    };
    
    std::sort(std::begin(collection),std::end(collection),compare);

}

int main()
{

    std::vector<dummy_struct> test;
    
    test.push_back(dummy_struct("Entry[1]",1));
    test.push_back(dummy_struct("Entry[2]",2));
    test.push_back(dummy_struct("Entry[3]",3));
    
    SortByCustomKey(test,std::regex("[0-9]+"));
}

我在这里想念什么?

标签: c++

解决方案


std::sort 通过交换它的元素来对向量进行排序。

这需要您的类实现复制赋值运算符const(或移动赋值),由于类中的字段,编译器不会为您生成该运算符。对于您的示例,唯一的解决方案似乎是const从字段中删除限定符。如果您不希望它们被修改,只需制作它们private并且不提供(公共)设置器。如果它们绝对必须留在那里,而您只想按排序顺序获取值,则可以使用不同的结构或将指针存储在向量中。

另一种解决方案是为您的类编写一个自定义swap实现,该实现将const_cast去掉字段的限定符以用于赋值,尽管这通常是一种不好的代码味道。


推荐阅读