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

时间:2009-03-11 14:08:47

标签: c++ const

我正在扩展的程序大量使用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对象的指针。

4 个答案:

答案 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