How to call a template super class's constructor from a template base class's constructor in c++?

与世无争的帅哥 提交于 2021-02-05 09:41:38

问题


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

回答1:


Use

template <class T> IntArray<T>::IntArray(T s) throw() : Array<T>(s) {}
                                                        //   ^^^ Use <T>

More importantly, put the implemetation also in the .h file.

See Why can templates only be implemented in the header file?.

Other Issues I Noticed

  • It does not make sense that you are using T s for size. std::size_t s makes more sense.
  • It does not make sense that IntArray is a class template. It makes more sense to me to use:

    class IntArray : public Array<int> { ... };
    


来源:https://stackoverflow.com/questions/43441042/how-to-call-a-template-super-classs-constructor-from-a-template-base-classs-co

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!