Saya mendapatkan kesalahan berikut:
kesalahan C2440: 'static_cast' : tidak dapat mengonversi dari 'std::shared_ptr‹_Ty>' ke 'std::shared_ptr‹_Ty> stack\genericstack.h 36 1 Tumpukan
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;
}
Utama.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;
}
Mengapa saya mendapatkan kesalahan?
Saya berharap pemeran akan berhasil, karena dengan pointer mentah saya selalu dapat mengubah huruf dari void*
ke pointer tipe sebenarnya.
Yang ingin saya lakukan di sini adalah membuat templat tumpukan. Namun saya mencoba menggunakan kembali kode sebanyak yang saya bisa, sehingga kelas yang ditemplat tidak terlalu membengkak.
Terima kasih.
std::shared_ptr
menjaga keamanan tipe, dan Anda mencoba membuangnya. Ingat juga bahwa berhasil hanya akan melindungi Anda dari kesalahan kompiler yang mencolok, dan tidak aman terkait dengan perilaku tidak terdefinisi. - person πάντα ῥεῖ   schedule 25.11.2018_GENERIC_STACK_TROFIMOV_H_
. Ini secara formal merupakan pengenal khusus. - person curiousguy   schedule 25.11.2018shared_ptr<void>
shared_ptr<T>
. - person yourbuddy   schedule 25.11.2018static_cast
1) bukan operator yang dapat kelebihan beban 2) untuk tipe yang ditentukan pengguna: hanya dapat melakukan apa yang dapat dilakukan oleh panggilan konstruktor - person curiousguy   schedule 25.11.2018