- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我收到以下错误:
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
要求类型 from
和 to
是可转换的。对于 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/
我正在为 64 位构建软件,之前是为 32 位构建的软件。当我为 64 位构建软件时,该软件完全适用于 32 位,它给出了一些错误,如 error C2782: 'const _Ty &std::mi
我有一个并发队列的模板化实现,它具有如下所示的推送功能: template class concurrent_queue { public: // other code... voi
我在尝试编译以下内容时收到此错误消息 void MyClass::MyFunc() const { int i= 0; myList.push_back(i); } 尽管它返回
我收到以下错误: error C2440: 'static_cast' : cannot convert from 'std::shared_ptr' to 'std::shared_ptr stac
你好,我有两个问题: cannot convert from 'std::vector' to 'std::vector & void CMapObjectPropertyPageAmbience::
我正在实现一个 Visual C++ 项目,它使用 Windows 窗体。我需要使用 C++ 堆栈,我使用了 stack<> .但它给出了这个错误。我包括 #include 和 using names
这个问题在这里已经有了答案: C++: Can I cast a vector to a vector during a function call? (5 个答案) 关闭 9 年前。 问题1>
目前我正在尝试使用 std::unique_ptr,但我在 Visual Studio 2012 中遇到编译器错误。 class A { private: unique_ptr other; pub
如何更正下面的代码以避免出现错误消息?这段代码不应该工作吗?是否可以使用不同的技术(packaged_task、asynch)? #include #include using namespace
错误 C2664:“void std::vector::push_back(_Ty&&)”:无法将参数 1 从“Node *”转换为“Node&&” 我需要帮助... 我创建了 node.h 和 he
我在我的 cpp 函数中引用了一个模板化的快速排序方法,如下所示: main.cpp QuickSort>(testData); testData 在哪里: int arr[] = {0, 5, 3,
我试图通过使用静态断言来禁止创建 const MyClass 类型。当一个类被声明为 const 时,this 关键字的类型为 const MyClass* 所以我认为这会起作用 class MyCl
我正在学习模板,尤其是 std::forward ;当我检查它的实现时,它使用另一个类模板 std::remove_reference在其参数列表中: template _Ty&& forward(t
在完成我的游戏原型(prototype)时,我遇到了这个错误,我以前从未见过。我试图将两个 .cpp 文件链接在一起,这个: #include #include "mage.h"
我目前有一个如下所示的类。 #define SET_METHOD( t , n ) \ private: t n; \ public: void set_##n( t value
//define typedef std::vector vertex_data; //serialise std::ostringstream oss; boost::archive::text_o
我有一个头文件SomeDefines.h,其中包括 #define U64 unsigned long long #define U16 unsigned short 在Myclass.h中,我在顶部
priority_queue> wait_queue; 去编译我的作业并修复所有错误,除了关于这行代码的错误.. 最佳答案 std::priority_queue 的第二个模板参数是适配容器,而不是比
以下代码有效: void CMyPlugin8::myMessageBox(std::string& myString) { myString = "Received the followin
我正在将一些 C++ 代码从 VisualStudio 6 升级到 VisualStudio 2008。 有一个类“GenExportableTree”,看起来很像来自 Dinkumware 的 xt
我是一名优秀的程序员,十分优秀!