Получил этот код (должно быть все, что имеет отношение к делу):
//movable_ptr.hpp
//Michal Cermak
#ifndef MOVABLE_H
#define MOVABLE_H
template<typename T> class movable_ptr;
template<typename T> class enable_movable_ptr {
public:
//default constructor
enable_movable_ptr() {};
enable_movable_ptr(T* p) : ptr_(p) {};
//operators...
T& operator*() const { return *ptr_; };
T* operator->() const { return ptr_; };
bool operator==(const enable_movable_ptr<T>& p) const { return p.ptr_ == ptr_; };
T* get() {return ptr_; };
private:
T* ptr_ = nullptr;
};
template<typename T> class movable_ptr {
public:
//parameterless constructor
movable_ptr() {};
//constructor from T*
movable_ptr(T* p) : ptr_(p) { add_to_tracked(this); };
//operators ...
enable_movable_ptr<T>& operator*() const { return *ptr_; };
enable_movable_ptr<T>* operator->() const { return ptr_; };
bool operator==(const movable_ptr<T>& p) const { return p.ptr_ == ptr_; };
//access to variables
enable_movable_ptr<T>* get() {return ptr_; };
void set(enable_movable_ptr<T>* p) { ptr_ = p; };
private:
enable_movable_ptr<T>* ptr_ = nullptr;
};
template<typename T> movable_ptr<T> get_movable(enable_movable_ptr<T>& p){
return new movable_ptr<T>(p);
};
#endif
Моя проблема в том, что когда я запускаю следующий код (или другие подобные по этому вопросу), movable_ptr<T>
не делает ' не получает ссылки до A
, но застревает на enable_movable_ptr<A>
, что приводит к ошибкам сравнения и других вещей, потому что "val
" не является членом enable_movable_ptr<A>
". Однако он является членом A, поэтому, если я правильно откажусь от ссылки, он должен работать.
#include <iostream>
#include <memory>
#include <string>
#include "movable_ptr.hpp"
using namespace std;
class A : public enable_movable_ptr<A>
{
public:
int val;
A(int val) : val(val) {}
};
void test_ptr_dereference() {
A x(42);
auto px = get_movable(x);
TEST_ASSERT(&*px == &x);
TEST_ASSERT(&px->val == &x.val);
}
int main(int argc, char* argv[]) {
test_ptr_dereference();
}
Я предполагаю, что я сделал что-то не так в перегруженных операторах, но в остальном не имею понятия. Есть идеи как это исправить?