Tuesday, March 1, 2011

Can't assign a member which is a pointer to a templatized class

My problem is that in my "Widget" class i've the following declaration:

MouseEvent* X;

In a member function I initialize the pointer with an address the normal way:

X = new MouseEvent;

Ok, this last line makes the compiler stop at:

error C2166: l-value specifies const object

All right, a MouseEvent is declared as a typedef to simplify things:

typedef Event__2<void, Widget&, const MouseEventArgs&> MouseEvent;

And Event__2 is, as you may imagine as: (basic structure shown):

template <typename return_type, typename arg1_T, typename arg2_T>
class Event__2
{
     ...
};

I don't know where the Event__2 class gets the const qualifier. Any tips ?

Thanks.

From stackoverflow
  • Likely, the member function where you are initializing X is marked as const - something like this.

    class Foo
    {
       int *Bar;
    
    public:
    
       void AssignAndDoStuff() const
       {
          Bar = new int; // Can't assign to a const object.
          // other code
       }
    }
    

    The solution here is either to

    1. Assign to Bar in a separate non-const method,
    2. change AssignAndDoStuff to be non-const, or
    3. mark Bar as mutable.

    Pick one of the above:

    class Foo
    {
       mutable int *Bar; // 3
    
    public:
       void Assign() // 1
       {
           Bar = new int; 
       }   
       void DoStuff() const
       {
           // Other code
       }
    
       void AssignAndDoStuff() // 2
       {
          Bar = new int; 
          // other code
       }
    }
    
    Greg Hewgill : +1 for psychic debugging.
    Shmoopty : Agreed. Impressive, Josh!
  • Likely, the member function where you are initializing X is marked as const.

    AAAARRRGHH!!! That was the problem.... Thank you Josh, this is caused by coding at 4:10 AM, i'm going now to bed :)

    Thank you.

    Eclipse : Glad I can help - I've hit the same problem often enough!

0 comments:

Post a Comment