gpt4 book ai didi

c++ - 如何在 C++ 中从模板基类的构造函数调用模板父类(super class)的构造函数?

转载 作者:行者123 更新时间:2023-11-28 01:49:47 30 4
gpt4 key购买 nike

我正在使用 sublimetext3 在 C++ 中编程。我的程序有一个名为 Array 的父类(super class)和一个名为 IntArray 的子类。这两个类都是模板类。目前,我在编译程序时遇到问题。它一直在我的 IntArray.cpp 文件中给我一个错误,特别是在我的基类构造函数中,我在其中调用并使用基类构造函数的参数初始化父类(super class)的构造函数。我不确定如何从子类的模板构造函数调用父类(super class)的模板构造函数。错误信息如下所示。此外,错误消息下方是我的 main.cpp、Array.cpp、Array.h、IntArray.cpp、IntArray.h 和 Makefile 的源代码文件。该计划尚未完成。我目前只有一种方法可以获取数组的大小。

来自终端的错误消息:

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

数组.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

生成文件

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

最佳答案

使用

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

更重要的是,将实现也放在 .h 文件中。

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

我注意到的其他问题

  • 使用 T s 作为大小是没有意义的。 std::size_t s 更有意义。
  • IntArray 是类模板是没有意义的。对我来说使用更有意义:

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

关于c++ - 如何在 C++ 中从模板基类的构造函数调用模板父类(super class)的构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43441042/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com