Problem with Copy Constructor and overloaded assignment operator with templates

S

saxman

Hi everyone,

I'm writing a class that inherits from std::vector in order to add
some additional functionality. I'm having a compiler problem, however,
when I have a function that returns this class. I've drilled down and
been able to create a very simple example of the problem. Here's my
code:

<code>
#include <vector>
#include <iostream>

using std::vector;
using std::cout;
using std::endl;

template <typename T>
class B : public std::vector<T>
{
public:
B(){ cout << "In B ctor" << endl; }

B(B<T> &b) { cout << "In B copy ctor" << endl; }

B<T>& operator=(const B<T> &b) { cout << "In B assign." << endl;
return *this; }

~B(){ cout << "In B destructor" << endl; }

};

B<int> test()
{
B<int> returnVal;
return returnVal;
}

int main()
{
B<int> b;
b = test();
return 0;
}
</code>

I get the following error when compiling:
test.cpp: In function `int main()':
test.cpp:31: error: no matching function for call to
`B<int>::B(B<int>)'
test.cpp:14: note: candidates are: B<T>::B(B<T>&) [with T = int]

Does anyone know of a solution?

Some additional information: any of the following code in 'main'
compiles fine:
<code>
B<int> b;
B<int> b2 = b;
return 0;
</code>

or

<code>
B<int> b;
B<int> b2;
b2 = b;
return 0;
</code>

or

<code>
B<int> b;
B<int> b2(b);
return 0;
</code>

Any help would be greatly appreciated.
 
?

=?iso-8859-1?q?Erik_Wikstr=F6m?=

Hi everyone,

I'm writing a class that inherits from std::vector in order to add
some additional functionality. I'm having a compiler problem, however,
when I have a function that returns this class. I've drilled down and
been able to create a very simple example of the problem. Here's my
code:

<code>
#include <vector>
#include <iostream>

using std::vector;
using std::cout;
using std::endl;

template <typename T>
class B : public std::vector<T>
{
public:
B(){ cout << "In B ctor" << endl; }

B(B<T> &b) { cout << "In B copy ctor" << endl; }

B<T>& operator=(const B<T> &b) { cout << "In B assign." << endl;
return *this; }

~B(){ cout << "In B destructor" << endl; }

};

B<int> test()
{
B<int> returnVal;
return returnVal;

}

int main()
{
B<int> b;
b = test();

The problem is that the compiler converts this to a copy-constructor
call like this 'B<int>(test())', however since your copy-constructor
takes a reference as a parameter this can not compile (since a
reference can not bind to the temporary returned by test()). To solve
this simply change the copy-constructor to 'B(const B<T> &b)'. In
general the parameters to copy-constructors should be const.
 
S

saxman

The problem is that the compiler converts this to a copy-constructor
call like this 'B<int>(test())', however since your copy-constructor
takes a reference as a parameter this can not compile (since a
reference can not bind to the temporary returned by test()). To solve
this simply change the copy-constructor to 'B(const B<T> &b)'. In
general the parameters to copy-constructors should be const.

Thanks for the help and the explanation, that worked perfectly
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,968
Messages
2,570,152
Members
46,697
Latest member
AugustNabo

Latest Threads

Top