You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用模板实现栈时遭遇shared_ptr类型转换错误求助

解决编译错误的步骤

1. 修正Seq_NodePtr的类型定义

错误核心是Seq_NodePtr的类型与std::make_shared创建的指针类型不匹配。需确保Seq_NodePtr是指向ProjectAlpha::Seq_Node<T>的shared_ptr模板别名,且定义在ProjectAlpha命名空间内。

在stack.hpp中补充前向声明和类型别名:

#pragma once
#include <memory>

namespace ProjectAlpha {
    // 前向声明Seq_Node模板类
    template<class T>
    class Seq_Node;

    // 定义Seq_NodePtr为指向当前命名空间内Seq_Node<T>的shared_ptr
    template<class T>
    using Seq_NodePtr = std::shared_ptr<Seq_Node<T>>;

    template<class T>
    class Stack {
    public:
        Stack();
        void insert(T& data);
        void remove();
        size_t size();
        T& top();

    private:
        size_t num_elements;
        Seq_NodePtr<T> head; // 使用带模板参数的Seq_NodePtr
    };
}

2. 修正insert函数中的指针与空指针问题

在Stack<T>::insert函数中使用正确的指针类型,同时避免初始head为空时的非法访问:

#pragma once
#include "ProjektAlpha/stack.hpp"
#include <memory>

namespace ProjectAlpha {
  template<class T> Stack<T>::Stack() :
  num_elements(0),
  head(nullptr)
  {  
  }

  template<class T> void Stack<T>::insert(T& data) {
    // 使用匹配的Seq_NodePtr<T>类型
    Seq_NodePtr<T> front = std::make_shared<Seq_Node<T>>(data);
    this->num_elements++;
    // 处理head为空的情况,避免空指针访问
    front->next = this->head;
    this->head = front;
  };
  
  template<class T> void Stack<T>::remove() {
    if (num_elements == 0) return; // 避免空栈操作
    num_elements--;
    auto temp = this->head;
    this->head = this->head->next;
    // shared_ptr会自动释放temp指向的节点
  }

  template<class T> size_t Stack<T>::size() {
    return num_elements;
  }

  template<class T> T& Stack<T>::top() {
    // 实际使用中需添加空栈判断,此处先假设栈非空
    return this->head->data_;
  }
}

3. 完善seq_node.hpp的类定义

确保Seq_Node类的成员变量被正确声明:

#pragma once

namespace ProjectAlpha {
  template<class T>
  class Seq_Node {
  public:
    T data_;
    std::shared_ptr<Seq_Node<T>> next;

    Seq_Node(T& data) :
      data_(data),
      next(nullptr)
    {
    };
  };
}

4. 测试代码编译

此时你的测试代码可以正常编译,类型不匹配的核心错误已解决,同时修复了空指针访问的潜在问题。

内容的提问来源于stack exchange,提问作者Eisdämon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:47:02