无法从 std::shared_ptr<_Ty> 转换为 std::shared_ptr<_Ty>
Cannot convert from std::shared_ptr<_Ty> to std::shared_ptr<_Ty>
我收到以下错误:
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*
到真实类型指针。
我想在这里做的是创建一个堆栈模板。但我正在尝试尽可能多地重用代码,这样模板化的 类 就不会膨胀太多。
谢谢。
看看the list of constructors for shared_ptr
。您正在尝试使用重载 9,更具体地说是使用 Y = void
和 T = int
的模板重载。但是,此模板重载 不参与重载决议 ,因为 void*
不能 隐式 转换为 int*
。换句话说,如果不能将 void*
隐式转换为 T*
.
,则即使显式也不能将 shared_ptr<void>
转换为 shared_ptr<T>
为什么不首先使用模板(将 GenericStack
功能移动到 TStack
),而不是尝试处理 void*
?
But I am trying to reuse as much code as I can, so that templated classes would not swell too much.
"swell",我假设您的意思是模板解决方案会生成太多实例?你有什么理由相信它确实太多了?
您收到该错误是因为 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()); }
您的薄模板包装器将构建良好。
我收到以下错误:
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*
到真实类型指针。
我想在这里做的是创建一个堆栈模板。但我正在尝试尽可能多地重用代码,这样模板化的 类 就不会膨胀太多。
谢谢。
看看the list of constructors for shared_ptr
。您正在尝试使用重载 9,更具体地说是使用 Y = void
和 T = int
的模板重载。但是,此模板重载 不参与重载决议 ,因为 void*
不能 隐式 转换为 int*
。换句话说,如果不能将 void*
隐式转换为 T*
.
shared_ptr<void>
转换为 shared_ptr<T>
为什么不首先使用模板(将 GenericStack
功能移动到 TStack
),而不是尝试处理 void*
?
But I am trying to reuse as much code as I can, so that templated classes would not swell too much.
"swell",我假设您的意思是模板解决方案会生成太多实例?你有什么理由相信它确实太多了?
您收到该错误是因为 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()); }
您的薄模板包装器将构建良好。