当type为String时,模板堆栈会出错

时间:2014-10-25 12:55:09

标签: c++ string templates stack

我想创建一个带有模板堆栈实现的字符串堆栈,但程序在s_ptr = new T(size)时给出“从int到const char *的无效转换”错误;线。

我的Stack.h

using namespace std;
template <class T>
class Stack{

    private:
        int size,top;
        T *s_ptr;

    public:
        Stack(int);
        void push(T val);
        T pop();
        bool isfull();
        bool isempty();

};

template <class T>
Stack <T> :: Stack (int maxsize)
{
    size=maxsize;
    top=-1;
    s_ptr=new T(size);
}

template <class T>
void Stack <T> :: push(T value){
    if(!isfull()){
        s_ptr[++top]=value;
    }
    else{
    cout << "Stack is full";
    }
}

template <class T>
T Stack <T> ::pop()
{
    if(!isempty()){
        return s_ptr[top--];
    }
    else{
        cout << "Stack is empty";
    }
}

template <class T>
bool Stack <T>::isfull(){
    return top == size-1 ;
}

template <class T>
bool Stack <T>::isempty(){
    return top ==-1 ;
}

main中的代码是

Stack <string> Stack1(50);

我该如何解决这个问题?对不起,如果之前被问到,但我做了很多研究。感谢...

3 个答案:

答案 0 :(得分:0)

new T(size)生成一个元素,使用值size初始化,如果无法使用int值初始化类型,则会失败。

看起来你想创建一个数组;这是new T[size]

答案 1 :(得分:0)

嗯,我想你想分配多个字符串。您只分配一个字符串/对象。

new string(12)

正在调用std :: string构造函数,它不实现string(int)

如果你想分配多个字符串,你必须这样做:

new string[12]

new T[size]

此外,您的类正在泄漏内存,因为您永远不会释放已分配的内存。

答案 2 :(得分:0)

错误地使用以下指令为您的阵列分配内存:

 s_ptr=new T(size);

实际上,这一行将使用构造函数T(int size)创建类型为T的单个新对象。 您收到的错误意味着编译器找不到任何接受int。

的String构造函数

你真正需要的是为T类型的 size 元素分配内存。那就是:

s_ptr = new T[size];

这将正确创建指向一组字符串的指针。

PS:记得在Stack实现中添加一个析构函数,释放分配的内存。