On Jun 12, 10:16 am, Erik Wikström <eri...@student.chalmers.se> wrote:
> On 12 Juni, 16:08, saxman <erll...@gmail.com> wrote:
>
>
>
> > 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.
>
> --
> Erik Wikström
Thanks for the help and the explanation, that worked perfectly
|