非静态const成员,不能使用默认赋值运算符

Ed *_*mes 44 c++ const

我正在扩展的程序使用std::pair<>了很多.

在我的代码中有一点,编译器抛出一个相当大的:

非静态const成员'const Ptr std :: pair,const double*> :: first'不能使用默认赋值运算符

我不确定这指的是什么?Ptr类缺少哪些方法?

导致此问题的原始调用如下:

vector_of_connections.pushback(pair(Ptr<double,double>,WeightValue*));
Run Code Online (Sandbox Code Playgroud)

它放在std::Pair<Ptr<double,double>, WeightValue*>一个向量上的位置,其中WeightValue*是一个来自大约3个函数的const变量,Ptr<double,double>它取自一个在另一个向量上工作的迭代器.

供将来参考,Ptr<double,double>是指向Node对象的指针.

Joh*_*itb 77

你有这样的案例:

struct sample {
    int const a; // const!

    sample(int a):a(a) { }
};
Run Code Online (Sandbox Code Playgroud)

现在,您在需要sample可分配的某些上下文中使用它- 可能在容器中(如地图,矢量或其他内容).这将失败,因为隐式定义的复制赋值运算符沿着这一行做了一些事情:

// pseudo code, for illustration
a = other.a;
Run Code Online (Sandbox Code Playgroud)

但是a是const!.你必须使它成为非常量.它没有受到伤害,因为只要你不改变它,它仍然是逻辑上的const :)你可以通过引入一个合适的修复问题operator=,使编译器不能隐式定义一个.但这很糟糕,因为你无法改变你的const成员.因此,有一个运算符=,但仍然不能分配!(因为副本和赋值不相同!):

struct sample {
    int const a; // const!

    sample(int a):a(a) { }

    // bad!
    sample & operator=(sample const&) { }
};
Run Code Online (Sandbox Code Playgroud)

但是在你的情况下,明显的问题显然在于std::pair<A, B>.请记住,a std::map按其包含的键排序.因此,您无法更改其键,因为这可能会轻易地使地图的状态无效.因此,以下内容成立:

typedef std::map<A, B> map;
map::value_type <=> std::pair<A const, B>
Run Code Online (Sandbox Code Playgroud)

也就是说,它禁止更改它包含的密钥!所以,如果你这样做

*mymap.begin() = make_pair(anotherKey, anotherValue);
Run Code Online (Sandbox Code Playgroud)

地图会向您抛出错误,因为在地图中存储的一对值中,该::first成员具有const限定类型!


小智 14

我遇到了同样的问题,并且遇到了这个页面.

http://blog.copton.net/archives/2007/10/13/stdvector/index.html

从页面:

请注意,这不是GNU特定的问题.ISO C++标准要求T具有赋值运算符(参见第23.2.4.3节).我只是展示了GNU的STL实现的例子,这可以导致.

  • 仅供参考,看来 blog.copton.net 已不再运行:/ (2认同)