繁体   English   中英

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

[英]Non-static const member, can't use default assignment operator

我正在扩展的程序经常使用std::pair<>

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

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

我不太确定这是指什么? Ptr class 中缺少哪些方法?

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

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 object 的指针。

你有这样的情况:

struct sample {
    int const a; // const!

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

现在,您在某些需要可分配sample的上下文中使用它 - 可能在容器中(如 map、向量或其他东西)。 这将失败,因为隐式定义的复制赋值运算符会沿着这条线做了一些事情:

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

但是a是 const .. 你必须使它成为非 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是按其包含的键排序的。 因此,您无法更改其密钥,因为这很容易导致 map 的 state 无效。 因此,以下内容成立:

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

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

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

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

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

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,因此您不能分配给它们。

至少要提到编译器抱怨的是哪个 object。 很可能您缺少自定义分配成员。 如果您没有,则使用默认值。可能,您在 class 中也有一个 const 成员(正在分配其对象),并且由于无法更改 const 成员,因此您遇到了该错误。

另一种方法:由于它是 class const ,因此我建议您将其更改为static const如果有意义的话。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM