Problem with Copy Constructor and overloaded assignment operator with templates

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • saxman

    Problem with Copy Constructor and overloaded assignment operator with templates

    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<in t>)'
    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.

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

    #2
    Re: Problem with Copy Constructor and overloaded assignment operator with templates

    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

    Comment

    • saxman

      #3
      Re: Problem with Copy Constructor and overloaded assignment operator with templates

      On Jun 12, 10:16 am, Erik Wikström <eri...@student .chalmers.sewro te:
      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

      Comment

      Working...