如何在构造函数s
中初始化模板类型T
的数组Stack()
?这可能是一个非常简单的问题,但我对c ++知之甚少。我在编译时遇到这个错误(GNU GCC):
错误:将'double *'赋值为'double [0]'
时出现不兼容的类型
这就是我在Stack
中初始化main.cpp
对象的方式:
Stack<double> stack;
这是我的Stack.h
文件(包括实现):
#pragma once
#include <iostream>
using namespace std;
template <class T>
class Stack
{
public:
Stack();
private:
T s[];
int N;
};
template <class T>
Stack<T>::Stack() {
s = new T[5];
}
答案 0 :(得分:2)
更改
//...
private:
T s[];
到
//...
private:
T *s;
此声明
private:
T s[];
不符合C ++。数组的大小应该是一个常量表达式。此外,您声明了一个数组,但在构造函数
中将其用作指针s = new T[5];
或使用std::vector
代替手动分配的数组。
答案 1 :(得分:0)
首先,必须在编译时知道放在堆栈上的数组的大小,所以
T s[];
shoud读取例如
T s[10];
第二个T
数组是不同的类型,然后T*
返回new
。
解决方案:
class Stack
{
public:
Stack();
~Stack() { delete[] s_;} // to avoid memory leak delete the array
private:
T* s;
int N;
};
template <class T>
Stack<T>::Stack() {
s = new T[10];
}
用法:
int main() {
Stack<int> s;
return 0;
}
更好的是,将数组的大小设为模板参数:
template <class T, size_t N>
class Stack
{
public:
Stack();
~Stack() { delete[] s_;} // to avoid memory leak delete the array
private:
T* s_;
int N_;
};
template <class T, size_t N>
Stack<T,N>::Stack() : N_( N) {
s_ = new T[N_];
}
用法:
int main() {
Stack< int,10> s;
return 0;
}
使用模板,使标准容器成为模板参数:
template <class T, size_t N, template<class T,
class = std::allocator<T> > class C >
class Stack
{
public:
Stack();
~Stack() {}
private:
C<T> s_;
int N_;
};
template <class T, size_t N, template<class T,
class = std::allocator<T> > class C >
Stack<T,N,C>::Stack() : N_( N) {
s_.resize( N_);
}
用法:
int main() {
Stack< int,10,std::vector > s;
return 0;
}
答案 2 :(得分:0)
另一种方法是将数组大小赋予所谓的非类型模板参数(我假设N代表当前堆栈大小,我假设):
template <class T, int size>
class Stack
{
public:
Stack() : N(0) {}
private:
T s[size];
int N;
};
您可以按如下方式使用它:
Stack<double, 5> myStack;