0

SOLVED: See answer on the bottom

I'm rather new to C++ so this might be a stupid question, but I am trying to write a template class for vectors using the built in STL vectors. It is an assignment from the University. I created a Header file and a cpp-source file, so I can define the class Vector in the Header and declare it's functions in the source file. I get the following errors:

Vector.cpp:27:59: error: invalid use of incomplete type ‘class Vector<T, n>’
Vector<T, n>& Vector<T, n>::operator=(const Vector<U,n>& v){
                                                           ^
In file included from Vector.cpp:1:0:
Vector.h:5:7: note: declaration of ‘class Vector<T, n>’
 class Vector {
       ^~~~~~
Vector.cpp:42:59: error: invalid use of incomplete type ‘class Vector<T, n>’
 Vector<T, n>& Vector<T, n>::operator+(const Vector<U,n>& v){
                                                           ^
In file included from Vector.cpp:1:0:
Vector.h:5:7: note: declaration of ‘class Vector<T, n>’
 class Vector {
       ^~~~~~

My code is this:

Header file (Vector.h):

#include <vector>
using namespace std;

template <class T, int n>
class Vector {
public:
    Vector();
    Vector(int);
    Vector(const Vector<T, n>&);

    ~Vector();

    template<class U>
    Vector<T, n> operator=(const Vector<U, n>&);

    T& operator[](int i);

    template<class U>
    Vector<T, n> operator+(const Vector<U, n>&);
    template<class U>
    Vector<T, n> operator-(const Vector<U, n>&);
    template<class U>
    T operator*(const Vector<U, n>&);

    template<class S>
    Vector<T, n> operator*(const S&);

  /*  template<class S>
    friend Vector<T, n> operator*(const S&, Vector<T, n>&);*/

    template<class F>
    Vector<T, n> apply_Funktor();

private:
    vector<T> values;
    const int size;
};
/*
template<class S, class T, int n>
Vector<T, n> operator*(const S& s, const Vector<T, n> v){
    return v * s;
};*/

And the source-cpp file:

#include "Vector.h"
#include <vector>
using namespace std;

template <class T, int n>
Vector<T, n>::Vector(): size(n){
    vector<T> values;
}

template <class T, int n>
Vector<T, n>::Vector(int v): size(n){
    vector<T> values;
    values.assign(v, n);
}

template <class T, int n>
Vector<T, n>::Vector(const Vector<T, n>& v): size(v.size){
    values = v.values;
}

template <class T, int n>
Vector<T, n>::~Vector(){
    delete values;
}

template<class U, class T, int n>
Vector<T, n>& Vector<T, n>::operator=(const Vector<U,n>& v){
    delete values;
    vector<T> values;
    for(int i = 0; i < size; i++){
        values.push_back((T) v.values[i]);
    }
    return *this;
}

template<class T, int n>
T& Vector<T, n>::operator[](int i){
    return values[i];
}

template<class U, class T, int n>
Vector<T, n>& Vector<T, n>::operator+(const Vector<U,n>& v){
//more Code to come but I already get the error here
}

The error occurs when I try to build my project with NetBeans. I dont have a main yet to use the Vector. I already searched the internet for solutions but I didnt come across anything helpful. I learned about forward declaration but it seems to me that this isnt the case here, because Im including the header file.

Thank you for your help :)

!!!EDIT / SOLUTION: My tutor in class solved it: The problem is that instead of doing

template<class U, class T, int n>

I have to put it like this:

template<class T, int n>
template<class U>
Pht
  • 15
  • 1
  • 5
  • Mhm maybe but if so why is there no error for the [ ] operator? And if I solved it with an implementation file and include it at the end of the header, why wouldnt the error show like it does now in my cpp file? Is it the file type or how does the implementation file know that it doesnt have to worry about that? – Pht Jan 31 '20 at 15:28
  • ***why is there no error for the [ ] operator?*** We can't answer that since you don't show the code that instantiates the template. – drescherjm Jan 31 '20 at 15:58

0 Answers0