使用类模板时在堆上创建对象
Posted
技术标签:
【中文标题】使用类模板时在堆上创建对象【英文标题】:Create object on heap when using class templates 【发布时间】:2019-09-29 21:46:35 【问题描述】:我想这样做:
Array<int>* arr = new Array();
但我不断收到错误消息:“数组”类的参数列表丢失。 不可能在堆上创建它吗?我还没有看到任何似乎可以做到这一点的代码。
我也尝试了另一种使用代码的方式:
Array<int>* arr;
然后尝试打印数组的内容,但它给了我它尚未实例化的错误。如果我不能在堆上创建它,我想如何动态地实例化它。毕竟,我不知道用户想要在其中放入什么。
这是我所有的代码:
Array.h
#ifndef _ARRAY_H_
#define _ARRAY_H_
#include <cstring> // for size_t definition
/**
* @class Array
*
* Basic implementation of a standard array class for chars.
*/
template <typename T>
class Array
public:
/// Type definition of the element type.
typedef T type;
/// Default constructor.
Array (void);
private:
/// Pointer to the actual data.
T* data_;
/// Current size of the array.
size_t cur_size_;
/// Maximum size of the array.
size_t max_size_;
;
#include "Array.inl"
//#include "Array.cpp"
#endif // !defined _ARRAY_H_
Array.cpp
#include <stdexcept> // for std::out_of_bounds exception
#include <iostream>
#include "Array.h"
#define MAX_SIZE_ 20
//
// Array
// Default Constructor
template <typename T>
Array <T>::Array (void)
:data_(new T[MAX_SIZE_]),
cur_size_(0),
max_size_(MAX_SIZE_)
Array.inl
//
// size
//
template <typename T>
inline
size_t Array <T>::size(void) const
return this->cur_size_;
//
// max_size
//
template <typename T>
inline
size_t Array <T>::max_size(void) const
return this->max_size_;
driver.cpp
#include <iostream>
//#include "Array_Base.h"
#include "Array.h"
int main(void)
Array<int>* arr = new Array();
std::cout << "Max size of array is: " << arr->max_size() << std::endl;
【问题讨论】:
投票结束是一个错字。Array<int>* arr = new Array();
应该是 Array<int>* arr = new Array<int>();
或者更简单的 auto arr = new Array<int>();
。
#define _ARRAY_H_
这是一个保留的标识符。通过定义它,您的程序将具有未定义的行为。您应该使用另一个标头保护。
为什么不直接使用Array<int> arr;
?
【参考方案1】:
因为类是一个模板类,只是Array
不是一个完整的类型。您需要包含模板类型。最后也不需要空括号。
Array<int>* arr = new Array<int>;
【讨论】:
我们还需要大小,即 Array以上是关于使用类模板时在堆上创建对象的主要内容,如果未能解决你的问题,请参考以下文章