mercredi 1 avril 2020

Try to pass an object to a same template class to copy

I work actually to understand the concept of template and implement a simple one. I manage to almost cases execpt one to code a constructor to copy an instance of same class.

#include <iostream>

// template <typename T>
template <class T>
class vec2 {
private:
    static int instance;
    T const x;
    T const y;
public:
    vec2() : x(0), y(0) {
        std::cout << "Default constructor" << std::endl;
        vec2<T>::instance++;
        return;
    }

    vec2(T const &x, T const &y) : x(x), y(y) {
        std::cout << "Parametric constructor" << std::endl;
        vec2<T>::instance++;
        return;
    }

    vec2(vec2<T> const & src) {
        *this = src;
        std::cout << "Copy constructor" << std::endl;
        vec2<T>::instance++;
        return;
    }

    ~vec2(){
        std::cout << "Destructor" << std::endl;
        vec2<T>::instance--;
        return;
    }

    vec2 & operator=(vec2 const & rhs) {
        this->x = rhs.get_x();
        this->y = rhs.get_y();
        return *this;
    }

  // get
    static int get_instance() {
        return vec2<T>::instance;
    }

    T get_x() const {
        return this->x;
    }

    T get_y() const {
        return this->y;
    }
}; 

template <class T>
std::ostream & operator<<(std::ostream & out, vec2<T> const & rhs) {
    out << "[ " << rhs.get_x() << ", " << rhs.get_y() << " ]";
    return out;
}

template <class T>
int vec2<T>::instance = 0;


int main() {
    vec2<float> a;
    vec2<int> b(21, 42);
    vec2<float> c(21.21f, 42.42f);
    vec2<bool> d(true, false);
    vec2<int> e(b);

    std::cout << a << std::endl;
    std::cout << b << std::endl;
    std::cout << c << std::endl;
    std::cout << d << std::endl;
    std::cout << e << std::endl;

    std::cout << "a.get_x(): " << a.get_x() << std::endl;
    std::cout << "a.get_y(): " << a.get_y() << std::endl;

    std::cout << "b.get_x(): " << b.get_x() << std::endl;
    std::cout << "b.get_y(): " << b.get_y() << std::endl;

    std::cout << "c.get_x(): " << c.get_x() << std::endl;
    std::cout << "c.get_y(): " << c.get_y() << std::endl;

    std::cout << "d.get_x(): " << d.get_x() << std::endl;
    std::cout << "d.get_y(): " << d.get_y() << std::endl;

    return (0);
}

here the error message, but I'm not expert te read it, and i don't understand what i must change in my code. So if anybody I have an idea to help a newbee in C++, that's can be awesome.

clang++  -std=c++11 -Wconversion *.cpp && ./a.out
main.cpp:24:2: error: constructor for 'vec2<int>' must explicitly initialize the
      const member 'x'
        vec2(vec2<T> const & src) {
        ^
main.cpp:72:12: note: in instantiation of member function 'vec2<int>::vec2'
      requested here
        vec2<int> e(b);
                  ^
main.cpp:9:10: note: declared here
        T const x;
                ^
main.cpp:24:2: error: constructor for 'vec2<int>' must explicitly initialize the
      const member 'y'
        vec2(vec2<T> const & src) {
        ^
main.cpp:10:10: note: declared here
        T const y;
                ^
main.cpp:38:11: error: cannot assign to non-static data member 'x' with
      const-qualified type 'const int'
                this->x = rhs.get_x();
                ~~~~~~~ ^
main.cpp:25:9: note: in instantiation of member function 'vec2<int>::operator='
      requested here
                *this = src;
                      ^
main.cpp:72:12: note: in instantiation of member function 'vec2<int>::vec2'
      requested here
        vec2<int> e(b);
                  ^
main.cpp:9:10: note: non-static data member 'x' declared const here
        T const x;
        ~~~~~~~~^
main.cpp:39:11: error: cannot assign to non-static data member 'y' with
      const-qualified type 'const int'
                this->y = rhs.get_y();
                ~~~~~~~ ^
main.cpp:10:10: note: non-static data member 'y' declared const here
        T const y;
        ~~~~~~~~^
4 errors generated.

Aucun commentaire:

Enregistrer un commentaire