C++ 无法从std::shared_ptr转换为std::shared_ptr
我得到以下错误: 错误C2440:“静态\u转换”:无法从“std::shared\u ptr”转换为“std::shared\u ptr stack\genericstack.h 36 1 stack” GenericStack.h GenerickStack.cpp Main.cpp 为什么我会出错 我希望转换能够成功进行,因为对于原始指针,我总是可以从void*到实际类型指针进行大小写 我想在这里做的是创建一个堆栈模板。但我正在尽可能多地重用代码,这样模板化的类就不会膨胀太多 谢谢。看一看。您正在尝试使用重载9,更具体地说是带有Y=void和T=int的模板重载。但是,此模板重载不参与重载解析,因为void*不能隐式转换为int*。换句话说,如果不能隐式地将void*转换为T*,则即使是显式地,也无法将shared_ptr转换为shared_ptr 为什么不首先使用模板将GenericStack功能移动到TStack中,而不是尝试处理void* 但我正在尽可能多地重用代码,这样模板化的类就不会膨胀太多C++ 无法从std::shared_ptr转换为std::shared_ptr,c++,pointers,casting,shared-ptr,smart-pointers,C++,Pointers,Casting,Shared Ptr,Smart Pointers,我得到以下错误: 错误C2440:“静态\u转换”:无法从“std::shared\u ptr”转换为“std::shared\u ptr stack\genericstack.h 36 1 stack” GenericStack.h GenerickStack.cpp Main.cpp 为什么我会出错 我希望转换能够成功进行,因为对于原始指针,我总是可以从void*到实际类型指针进行大小写 我想在这里做的是创建一个堆栈模板。但我正在尽可能多地重用代码,这样模板化的类就不会膨胀太多 谢谢。看一看
我想你是说模板解决方案会生成太多的实例?您有任何理由相信它确实太多了吗?您会得到这个错误,因为静态强制转换要求类型from和to是可转换的。对于共享的_ptr,只有在参与过载解决时才有效。但是它没有,因为Vult*不是隐式转换为C++中的其他对象指针类型,它需要一个显式的静态映射。 如果您想基于静态转换托管指针类型来转换共享指针,您需要使用,这就是它的用途 所以在解决了这个问题之后
std::shared_ptr<T> top() { return std::static_pointer_cast<T>(GenericStack::top()); }
您的精简模板包装器可以很好地构建。我希望转换能够成功,因为对于原始指针,我总是可以从void*到实际类型指针进行大小写。因为std::shared_ptr保留了类型安全性,您试图将其丢弃。还请记住,成功只会使您避免明显的编译器错误,对于未定义的行为是不安全的。@πάνταῥεῖ, 我想做的事不可能吗?我想做的事不可能吗?取决于这些类型之间的关系。挑剔与您的问题无关,但在技术上很重要:标识符的使用_GENERIC_STACK_TROFIMOV_H_。它在形式上是一个保留标识符。@πάνταῥεῖ, 他们没有关系,但每次演员阵容表演时,都会保证以前代替共享的\u ptr shared \u ptr的位置。请你帮我解决聊天中的另一个问题好吗?@yourbody-如果你有其他问题,可能值得再问一个问题。它是。非常感谢。
#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;
}
std::shared_ptr<T> top() { return std::static_pointer_cast<T>(GenericStack::top()); }