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

后端 未结 4 1595
北海茫月
北海茫月 2020-11-27 04:45

A program I\'m expanding uses std::pair<> a lot.

There is a point in my code at which the compiler throws a rather large:

N

相关标签:
4条回答
  • 2020-11-27 05:17

    I faced the same issue, and came across this page.

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

    From the page:

    Please note that this is no GNU specific problem here. The ISO C++ standard requires that T has an assignment operator (see section 23.2.4.3). I just showed on the example of GNU's STL implementation where this can lead to.

    0 讨论(0)
  • 2020-11-27 05:23

    At least mention which object the compiler is complaining about. Most probably you are missing a custom assignment member. If you don't have one, the default one kicks in. Probably, you also have a const member in that class (whose objects are being assigned) and since a const member cannot be changed you hit that error.

    Another approach: Since it's a class const, I suggest that you change it to a static const if that makes sense.

    0 讨论(0)
  • 2020-11-27 05:40

    You have a case like this:

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

    Now, you use that in some context that requires sample to be assignable - possible in a container (like a map, vector or something else). This will fail, because the implicitly defined copy assignment operator does something along this line:

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

    But a is const!. You have to make it non-const. It doesn't hurt because as long as you don't change it, it's still logically const :) You could fix the problem by introducing a suitable operator= too, making the compiler not define one implicitly. But that's bad because you will not be able to change your const member. Thus, having an operator=, but still not assignable! (because the copy and the assigned value are not identical!):

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

    However in your case, the apparent problem apparently lies within std::pair<A, B>. Remember that a std::map is sorted on the keys it contains. Because of that, you cannot change its keys, because that could easily render the state of a map invalid. Because of that, the following holds:

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

    That is, it forbids changing its keys that it contains! So if you do

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

    The map throws an error at you, because in the pair of some value stored in the map, the ::first member has a const qualified type!

    0 讨论(0)
  • 2020-11-27 05:43

    As far as I can tell, someplace you have something like:

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

    Since the members of MyPair are const, you can't assign to them.

    0 讨论(0)
提交回复
热议问题