Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无法从std::shared_ptr转换为std::shared_ptr_C++_Pointers_Casting_Shared Ptr_Smart Pointers - Fatal编程技术网

C++ 无法从std::shared_ptr转换为std::shared_ptr

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*到实际类型指针进行大小写 我想在这里做的是创建一个堆栈模板。但我正在尽可能多地重用代码,这样模板化的类就不会膨胀太多 谢谢。看一看

我得到以下错误:

错误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*

但我正在尽可能多地重用代码,这样模板化的类就不会膨胀太多


我想你是说模板解决方案会生成太多的实例?您有任何理由相信它确实太多了吗?

您会得到这个错误,因为静态强制转换要求类型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()); }