C++ 使用类的常量成员std::deque::erase编译错误

C++ 使用类的常量成员std::deque::erase编译错误,c++,stddeque,C++,Stddeque,我在这里得到一个编译错误,我不知道代码出了什么问题。我正在使用g++4.9.2 #include<iostream> #include<deque> using std::string; using std::deque; class Dummy { public: virtual ~Dummy(){}; Dummy():ID_("00") {}; private: const string ID_; }; int main(){

我在这里得到一个编译错误,我不知道代码出了什么问题。我正在使用g++4.9.2

#include<iostream>
#include<deque>

using std::string;
using std::deque;

class Dummy {
public:
    virtual ~Dummy(){};
    Dummy():ID_("00") {};
private:

    const string ID_;
};

int main(){
    {
    deque <Dummy> waiter;
    waiter.push_back(Dummy());
    waiter.erase( waiter.begin() );
    }
    return 0;
}
#包括
#包括
使用std::string;
使用std::deque;
类虚拟{
公众:
虚拟~Dummy(){};
Dummy():ID_u00“{};
私人:
常量字符串ID;
};
int main(){
{
德克服务员;
服务员,推回(哑巴());
服务员。删除(服务员。开始());
}
返回0;
}

编辑:我知道删除常量会删除编译错误,但我不知道为什么。无论如何,我需要这个常量。

您应该删除
常量前缀,以便可以更改字符串:

string ID_;
或者将其更改为静态变量,并按如下方式初始化:

class Dummy {
public:
    virtual ~Dummy(){};
    Dummy() {};
private:

    static const string ID_;
};

const string Dummy::ID_ = "00";
您可以找到有关常量字符串初始化的更多信息。

希望元素的类型应为:

类型要求

T必须满足可移动和可转让的要求

Dummy
有一个常量成员
const字符串ID,使其在默认赋值运算符下不可赋值

您可以将
ID\uu
设置为非常量成员,或者提供自己的赋值运算符以使其可赋值。e、 g

Dummy& operator=(const Dummy&) { /* do nothing */ }

请添加错误消息。我必须说,在编译了这篇文章之后,gcc 4.9.2的输出非常长,没有任何帮助。我不会在这里重复这一页,这是它的要点。删除擦除也可以修复编译错误。同意。我得到了同样的结果,但忽略了可移动可分配需求的相关性-很好地发现了@宋元耀你认为你的解决方案是“可转让”的合法吗?我想这一定是有原因的,它应该是可移动和可分配的…@varantir这是方法的要求。想象一下,如果您删除了
deque
中间的一个元素,它必须移动其余的元素来填补空缺。这意味着它将调用赋值操作符来移动它们的位置。@Songyuanyo但是如果我相应地修改了move assignable操作符,我认为删除元素时的移动不会正常工作!