By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
429,616 Members | 2,026 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 429,616 IT Pros & Developers. It's quick & easy.

Problem with Copy Constructor and overloaded assignment operator with templates

P: n/a
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<inttest()
{
B<intreturnVal;
return returnVal;
}

int main()
{
B<intb;
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<intb;
B<intb2 = b;
return 0;
</code>

or

<code>
B<intb;
B<intb2;
b2 = b;
return 0;
</code>

or

<code>
B<intb;
B<intb2(b);
return 0;
</code>

Any help would be greatly appreciated.

Jun 12 '07 #1
Share this Question
Share on Google+
2 Replies


P: n/a
On 12 Juni, 16:08, saxman <erll...@gmail.comwrote:
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<inttest()
{
B<intreturnVal;
return returnVal;

}

int main()
{
B<intb;
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.

--
Erik Wikström

Jun 12 '07 #2

P: n/a
On Jun 12, 10:16 am, Erik Wikström <eri...@student.chalmers.sewrote:
On 12 Juni, 16:08, saxman <erll...@gmail.comwrote:
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<inttest()
{
B<intreturnVal;
return returnVal;
}
int main()
{
B<intb;
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.

--
Erik Wikström
Thanks for the help and the explanation, that worked perfectly

Jun 12 '07 #3

This discussion thread is closed

Replies have been disabled for this discussion.