我正在扩展的程序大量使用std::pair<>
。
我的代码中有一点,编译器会抛出一个相当大的:
非静态const成员,'const Ptr std :: pair,const double *&gt; :: first'不能使用默认赋值运算符
我不确定这是指什么? Ptr类缺少哪些方法?
导致此问题的原始呼叫如下:
vector_of_connections.pushback(pair(Ptr<double,double>,WeightValue*));
它将std::Pair<Ptr<double,double>, WeightValue*>
置于向量上,其中WeightValue*
是来自大约3个函数的const变量,Ptr<double,double>
取自对另一个向量有效的迭代器。
为了将来参考,Ptr<double,double>
是指向Node
对象的指针。
答案 0 :(得分:77)
你有这样的案例:
struct sample {
int const a; // const!
sample(int a):a(a) { }
};
现在,您在某些需要sample
可分配的上下文中使用它 - 可能在容器中(如地图,矢量或其他内容)。这将失败,因为隐式定义的复制赋值运算符沿着这一行做了一些事情:
// pseudo code, for illustration
a = other.a;
但是a
是常量!你必须使它成为非常量。它没有受到伤害,因为只要你不改变它,它仍然是逻辑上的const :)你可以通过引入一个合适的operator=
来修复问题,使编译器不定义一个隐含的。但这很糟糕,因为你无法改变你的const成员。因此,有一个运算符=,但仍然不能分配! (因为副本和指定的值不相同!):
struct sample {
int const a; // const!
sample(int a):a(a) { }
// bad!
sample & operator=(sample const&) { }
};
然而在您的情况下,明显的问题显然在std::pair<A, B>
内。请记住,std::map
按其包含的键排序。因此,无法更改其键,因为这可能会轻易地使地图的状态无效。因此,以下内容成立:
typedef std::map<A, B> map;
map::value_type <=> std::pair<A const, B>
也就是说,它禁止更改它包含的密钥!所以,如果你这样做
*mymap.begin() = make_pair(anotherKey, anotherValue);
地图向您抛出错误,因为在地图中存储的一对值中,::first
成员具有const限定类型!
答案 1 :(得分:14)
我遇到了同样的问题,并且遇到了这个页面。
http://blog.copton.net/archives/2007/10/13/stdvector/index.html
从页面:
请注意,这不是GNU特定的问题。 ISO C ++标准要求T具有赋值运算符(参见第23.2.4.3节)。我只是展示了GNU的STL实现的例子,这可以导致。
答案 2 :(得分:1)
据我所知,某个地方你有类似的东西:
// for ease of reading
typedef std::pair<const Ptr<double, double>, const double*> MyPair;
MyPair myPair = MAKEPAIR(.....);
myPair.first = .....;
由于MyPair的成员是const,因此无法分配给他们。
答案 3 :(得分:-1)
至少提一下编译器抱怨的对象。很可能你缺少一个自定义任务成员。如果你没有,那么默认的就会启动。可能你在该类中也有一个const成员(其对象被分配),并且由于const成员无法更改,所以你会遇到该错误。
另一种方法:由于它是一个类const
,如果有意义,我建议您将其更改为static const
。