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

我正在扩展的一个程序使用std::pair<>很多。

在我的代码中,编译器会引发一个相当大的问题:

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

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

导致此问题的原始呼叫如下所示:

 vector_of_connections.pushback(pair(Ptr<double,double>,WeightValue*)); 

它将一个std::Pair<Ptr<double,double>, WeightValue*>放到一个vector上,其中WeightValue*是一个约3个函数的constvariables,而Ptr<double,double>是从迭代器在另一个向量上工作。

为了将来的参考, Ptr<double,double>是一个指向Node对象的指针。

你有这样的情况:

 struct sample { int const a; // const! sample(int a):a(a) { } }; 

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

 // pseudo code, for illustration a = other.a; 

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

 struct sample { int const a; // const! sample(int a):a(a) { } // bad! sample & operator=(sample const&) { } }; 

但是在你的情况下,明显的问题显然在于std::pair<A, B> 。 请记住,一个std::map按照它包含的键进行sorting。 正因为如此,你不能改变它的关键,因为这可能很容易使地图的状态无效。 因此,以下情况成立:

 typedef std::map<A, B> map; map::value_type <=> std::pair<A const, B> 

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

 *mymap.begin() = make_pair(anotherKey, anotherValue); 

地图会在你的地方抛出一个错误,因为在地图中存储的一对值中, ::first成员有一个const限定types!

我面临同样的问题,并遇到这个网页。

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

来自页面:

请注意,这里没有GNU特定的问题。 ISO C ++标准要求T有一个赋值操作符(见23.2.4.3节)。 我刚刚介绍了GNU的STL实现的例子,这可能导致。

据我所知,在某个地方你有这样的东西:

 // for ease of reading typedef std::pair<const Ptr<double, double>, const double*> MyPair; MyPair myPair = MAKEPAIR(.....); myPair.first = .....; 

由于MyPair的成员是const,所以不能分配给它们。

至less要提到编译器在抱怨什么对象。 很可能你错过了一个自定义分配成员。 如果你没有,那么默认的那个会踢。也许你在这个类中也有一个const成员(它的对象被赋值),并且由于const成员不能被改变,所以你会碰到这个错误。

另一种方法:因为它是一个类的const ,我build议你把它改成一个static const如果这是有道理的。