使用模板实现栈时遭遇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
相关产品推荐
相关产品推荐

