ฉันได้รับข้อผิดพลาดต่อไปนี้:
ข้อผิดพลาด C2440: 'static_cast' : ไม่สามารถแปลงจาก 'std::shared_ptr‹_Ty>' เป็น '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*
เป็นพอยน์เตอร์ประเภทจริงได้เสมอ
สิ่งที่ฉันต้องการทำที่นี่คือการสร้างเทมเพลตสแต็ก แต่ฉันกำลังพยายามนำโค้ดกลับมาใช้ใหม่ให้ได้มากที่สุด เพื่อที่คลาสที่สร้างเทมเพลตจะได้ไม่ขยายตัวมากเกินไป
ขอบคุณ
std::shared_ptr
รักษาความปลอดภัยของประเภท และคุณพยายามที่จะทิ้งสิ่งนั้นไป นอกจากนี้ โปรดทราบว่า สำเร็จ จะป้องกันคุณจากข้อผิดพลาดของคอมไพเลอร์ที่เห็นได้ชัดเท่านั้น และไม่ปลอดภัยเกี่ยวกับ พฤติกรรมที่ไม่ได้กำหนด - person πάντα ῥεῖ   schedule 25.11.2018_GENERIC_STACK_TROFIMOV_H_
เป็นตัวระบุที่สงวนไว้อย่างเป็นทางการ - person curiousguy   schedule 25.11.2018shared_ptr<void>
shared_ptr<T>
- person yourbuddy   schedule 25.11.2018static_cast
1) ไม่ใช่ตัวดำเนินการที่โอเวอร์โหลดได้ 2) สำหรับประเภทที่ผู้ใช้กำหนด: สามารถทำได้เฉพาะสิ่งที่การเรียกตัวสร้างสามารถทำได้เท่านั้น - person curiousguy   schedule 25.11.2018