c++ - 无法从 std::shared_ptr<_Ty> 转换为 std::shared_ptr<_Ty>
问题描述
我收到以下错误:
错误 C2440:“static_cast”:无法从“std::shared_ptr<_Ty>”转换为“std::shared_ptr<_Ty> stack\genericstack.h 36 1 Stack
通用堆栈.h
#ifndef _GENERIC_STACK_TROFIMOV_H_
#define _GENERIC_STACK_TROFIMOV_H_
#include <memory>
class GenericStack {
struct StackNode {
std::shared_ptr<void> _data;
StackNode* _next;
StackNode(const std::shared_ptr<void>& data, StackNode* next)
: _data(data), _next(next) {
}
};
StackNode* _top;
GenericStack(const GenericStack&);
GenericStack& operator=(const GenericStack&);
protected:
GenericStack();
~GenericStack();
void push(const std::shared_ptr<void>&);
void pop();
std::shared_ptr<void>& top();
bool isEmpty() const;
};
template <class T>
class TStack: private GenericStack {
public:
void push(const std::shared_ptr<T>& p) { GenericStack::push(p); }
void pop() { GenericStack::pop(); }
std::shared_ptr<T> top() { return static_cast<std::shared_ptr<T>>(GenericStack::top()); }
bool empty() const { return GenericStack::isEmpty(); }
};
#endif
GenerickStack.cpp
#include "GenericStack.h"
GenericStack::GenericStack()
:_top(0) {
};
GenericStack::~GenericStack() {
while(!isEmpty()) {
pop();
}
};
void GenericStack::push(const std::shared_ptr<void>& element) {
_top = new StackNode(element, _top);
}
std::shared_ptr<void>& GenericStack::top() {
return _top->_data;
}
void GenericStack::pop() {
StackNode* t = _top->_next;
delete _top;
_top = t;
}
bool GenericStack::isEmpty() const {
return !_top;
}
主文件
#include <iostream>
#include "GenericStack.h"
int main() {
TStack<int> gs;
std::shared_ptr<int> sh(new int(7));
gs.push(sh);
std::cout << *gs.top() << std::endl;
return 0;
}
为什么我会收到错误消息?
我希望转换成功发生,因为使用原始指针,我总是可以从void*
实际类型指针转换。
我在这里要做的是创建一个堆栈模板。但我试图尽可能多地重用代码,这样模板类就不会膨胀太多。
谢谢你。
解决方案
看看构造函数列表shared_ptr
。您正在尝试使用重载 9,更具体地说是模板重载 withY = void
和T = int
。但是,此模板重载不参与重载决议,因为void*
不能隐式转换为int*
. 换句话说,shared_ptr<void>
如果shared_ptr<T>
您不能隐式转换void*
为T*
.
为什么不首先使用模板(将GenericStack
功能移入TStack
),而不是尝试处理void*
?
但我试图尽可能多地重用代码,这样模板类就不会膨胀太多。
通过“膨胀”,我假设您的意思是模板解决方案会生成太多实例?你有理由相信它确实太多了吗?
推荐阅读
- python - Python 3.3+,标准 venv 虚拟环境包有什么原因或问题吗?
- arrays - 在C中初始化后如何将列表分配给数组
- reactjs - 在 react 和 typescript 中解构 useState 中的状态
- angular - 如何在 Angular 中显示来自 JSON 对象的图像
- mysql - 无法创建 2 个外键
- flutter - 根据风味分离 pubspec.yaml 文件
- javascript - 使用 Fetch 方法发送请求
- sql - Postgres - Distinct + jsonb_object_keys 给出了在不能接受集合的上下文中调用的错误集合值函数
- html - 引导列类不遵循边距或容器流体类
- java - 控制器不使用 Feign 可分页排序