【问题标题】:Template Stack gives error when type is String当类型为字符串时,模板堆栈给出错误
【发布时间】:2014-12-21 03:48:44
【问题描述】:

我想用模板堆栈实现创建一个字符串堆栈,但程序在 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);

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

【问题讨论】:

  • 压入栈时需要复制两次吗?

标签: c++ string templates stack


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    new string(12)
    

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

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

    new string[12]
    

    new T[size]

    此外,您的班级正在泄漏内存,因为您从未释放分配的内存。

    【讨论】:

      【解决方案3】:

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

       s_ptr=new T(size);
      

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

      您真正需要的是为 T 类型的 size 元素分配内存。即:

      s_ptr = new T[size];
      

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

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

      【讨论】:

      • "[malloc] 将正确地创建一个指向一组字符串的指针" - 不,它不会。它将创建一个指向一些未初始化内存的指针。
      猜你喜欢
      • 2020-08-31
      • 2020-07-31
      • 2017-04-20
      • 1970-01-01
      • 2020-01-27
      • 2021-12-14
      • 1970-01-01
      • 2021-09-19
      • 2019-02-16
      相关资源
      最近更新 更多