gpt4 book ai didi

c++ - 无法从 std::shared_ptr<_Ty> 转换为 std::shared_ptr<_Ty>

转载 作者:行者123 更新时间:2023-11-28 04:29:02 28 4
gpt4 key购买 nike

我收到以下错误:

error C2440: 'static_cast' : cannot convert from 'std::shared_ptr<_Ty>' to 'std::shared_ptr<_Ty> stack\genericstack.h 36 1 Stack

GenericStack.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;
}

main.cpp

#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* 转换为实际类型指针。

我想在这里做的是创建一个堆栈模板。但我正在尝试尽可能多地重用代码,这样模板化类就不会膨胀太多。

谢谢。

最佳答案

你得到那个错误是因为 static_cast 要求类型 fromto 是可转换的。对于 shared_ptr,只有在 c'tor overload 9 时才会成立。将参与过载决议。但事实并非如此,因为 void* 在 C++ 中不能隐式转换为其他对象指针类型,它需要一个显式的 static_cast

如果你想根据static_casting托管指针类型转换共享指针,你需要使用std::static_pointer_cast ,这就是它的用途。

所以在插入那个修复之后

 std::shared_ptr<T> top() { return std::static_pointer_cast<T>(GenericStack::top()); }

您的薄模板包装器将构建良好。

关于c++ - 无法从 std::shared_ptr<_Ty> 转换为 std::shared_ptr<_Ty>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53466552/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com