Solved

operator=(const &myclass)

Posted on 2002-06-21
6
394 Views
Last Modified: 2010-05-18
I've just spent a couple of hours tracking down an error, which turned out to be that a copy assignment operator was mistyped - what should have been

myclass& myclass::operator=(const myclass& m);

was actually written as

myclass& myclass::operator=(const &myclass m);

My question is - why did the second version compile at all?  Does it mean anything?
0
Comment
Question by:IainHere
6 Comments
 
LVL 49

Expert Comment

by:DanRollins
ID: 7099598
What compiler?  In VC++,

class CMyClass {
public:
     int n;
     CMyClass& operator=(const &CMyClass m);

};

returns:

 error C2146: syntax error : missing ',' before identifier 'm'
 error C2061: syntax error : identifier 'm'

-- Dan
0
 
LVL 4

Expert Comment

by:mblat
ID: 7099739


const& myclass m would mean "m is a const reference to a myclass". But that is redundant, since references are always const. You can't change a reference. Never.

In other words, "myclass& const m" is the same thingequivalent to "myclass& x". Since you're gaining nothing by adding the const after the &, you shouldn't add.
 So it is actually suprising that your compiler didn't complain, because this constact is nonsence.
0
 
LVL 4

Author Comment

by:IainHere
ID: 7103125
Dan - my apologies.  It was actually
CMyClass& operator=(const &CMyClass)
the operator was declared as private to stop anything using the default one, so the parameter wasn't actually being used so it wasn't named.

mblat - "references are always const".  I think I must be misunderstanding what you're saying - references don't have to to be const - if you pass them non-const, you can alter them as if they were pointers, but with object semantics.  Am I missing something?  Anyway, I'm sure the two things you state are equivalent are not.
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
LVL 9

Accepted Solution

by:
jasonclarke earned 50 total points
ID: 7103179
> CMyClass& operator=(const &CMyClass)

this is actually a real nasty, what this actually means is:
 
  CMyClass& operator=(const int& CMyClass)

i.e. declare an operator that takes a variable of type int (implicit) with name CMyClass.

try the following code to show it better:

class X
{
    operator=(const &X)
    {
         int i = X;
    }
};

this compiles just fine with VC++ -

it appears to be a VC++ failure, if you try to compile the same code with gcc, you get the following messages:

test.cpp:4: ISO C++ forbids declaration of `operator=' with no type
test.cpp:4: `X::operator= (...)' must take exactly one argument
test.cpp:4: `X::operator= (...)' must take exactly one argument
0
 
LVL 4

Author Comment

by:IainHere
ID: 7103657
Excellent!  Thanks for the description.

[apologies for leading you the merry dance, Dan - I'm sure you'll forgive me]
0
 
LVL 49

Expert Comment

by:DanRollins
ID: 7104877
>>Dan - my apologies.  It was actually CMyClass& operator=(const &CMyClass)

Well that is irritating beyond words.  But I accept your appology :-)

-- Dan
0

Featured Post

Free Tool: Postgres Monitoring System

A PHP and Perl based system to collect and display usage statistics from PostgreSQL databases.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Errors will happen. It is a fact of life for the programmer. How and when errors are detected have a great impact on quality and cost of a product. It is better to detect errors at compile time, when possible and practical. Errors that make their wa…
Often, when implementing a feature, you won't know how certain events should be handled at the point where they occur and you'd rather defer to the user of your function or class. For example, a XML parser will extract a tag from the source code, wh…
The goal of the video will be to teach the user the difference and consequence of passing data by value vs passing data by reference in C++. An example of passing data by value as well as an example of passing data by reference will be be given. Bot…
The viewer will learn how to clear a vector as well as how to detect empty vectors in C++.

791 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question