Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

I\'m programming in c++ using sublimetext3. My program has a superclass called A

ID: 3818772 • Letter: I

Question

I'm programming in c++ using sublimetext3. My program has a superclass called Array, and a subclass called IntArray. Both classes are template classes. Currently, I'm having trouble compiling the program. It keeps giving me an error in my IntArray.cpp file, specifically in my base class's constructor where I call and initialize the superclass's constructor with the parameter of the base class's constructor. I'm not sure how to call a superclass's template constructor from a subclass's template constructor. The error message is shown below. Also, below the error message are my source code files for main.cpp, Array.cpp, Array.h, IntArray.cpp, IntArray.h, and Makefile. The program is not yet complete. I currently only have one method that gets the size of the array.

Error message from terminal:

IntArray.cpp:4:56: error: member initializer 'Array' does not name a non-static

data member or base class

template<class T> IntArray<T>::IntArray(T s) throw() : Array(s) {

^~~~~~~~

1 error generated.

main.cpp

#include <iostream>
#include <string>
#include "Array.h"
#include "IntArray.h"

int main(int argc, char** argv) {

   // make an array of doubles with size 10
   Array<int> iA(10);

   // get the size of the array
   std::cout<< "The size of IntArray is" <<iA.getSize()<<std::endl;

} // end of main

Array.cpp

#include "Array.h"

// constructor
template<class T> Array<T>::Array(T s) throw() {
   size = s;
}

// destructor
template<class T> Array<T>::~Array() throw() {

}

// getter methods
template<class T> T Array<T>::getSize() const throw() {
   return size;
}

Array.h

#ifndef ARRAY_H
#define ARRAY_H

template<class T> class Array {
private:
   T size;

public:
   Array(T s) throw();
   virtual ~Array() throw();
   // getter methods that throws an exception if the index is out of bounds
   T getSize() const throw();


   // setters that throws an exception if the index is out of bounds
};

#endif

IntArray.cpp

#include "IntArray.h"

// constructor
template<class T> IntArray<T>::IntArray(T s) throw() : Array(s) {

}

// desctructor
template<class T> IntArray<T>::~IntArray() throw() {

}

IntArray.h

#ifndef INTARRAY_H
#define INTARRAY_H
#include "Array.h"

template<class T> class IntArray : public Array<T> {

public:
   IntArray(T s) throw();
   virtual ~IntArray() throw();
   //int getSize() const throw();
};

#endif

Makefile

all:main

main.o: main.cpp Array.h IntArray.h
   g++ -c -Werror main.cpp

Array.o: Array.cpp Array.h
   g++ -c -Werror Array.cpp

IntArray.o: IntArray.cpp IntArray.h
   g++ -c -Werror IntArray.cpp

main: main.o Array.o IntArray.o
   g++ -o main main.o Array.o IntArray.o

Explanation / Answer

The problem seems to be using the template class and separating out its definition between two files.

When using templates, it is advised to use a single file for writing the full implementation of that template class.

This is because, on compile time, compiler needs the complete code to link and build the correct function and type. So in this case, the definition of template class function is in another file and hence compiler cannot resolve it.

To solve this, you need to write the function definition in same file as the class ie Array.h and no need for Array.cpp.

Similarly, do the same for IntArray.