在构造函数中传递类成员时的c++语法错误

a C++ syntax error when passing class members in a constructor

本文关键字:c++ 语法 错误 成员 构造函数      更新时间:2023-10-16

我需要用c++编写一种shared_ptr<>。然而,我现在正在努力解决一个奇怪的错误。
以下代码:

template <typename T> class shared_ptr;
typedef std::map<void*, shared_ptr<void*>> ptr_t;
ptr_t ptr_set;
template <typename T> class shared_ptr
{
    T* ptr;
public:
    bool in_use;
    shared_ptr<T>()
    {
        ptr = new T;
        in_use = false;
        ptr_set.insert(ptr_t::value_type(ptr, *this)); // the error is here
    }
    T operator*()
    {
        return *ptr;
    }
    shared_ptr<T>(shared_ptr<T>& ref)
    {
        this->in_use = false;
        this->ptr = ref.ptr;
        T* p = this->ptr;
        ptr_set.insert(ptr_t::value_type(p, *this));
    }
};

拒绝编译,说'std::pair<_Ty1,_Ty2>::pair: 2个重载都不能转换所有的参数类型'(实际上是第13行C2665)。
顺便说一下,shared_ptr在main()中被实例化为shared_ptr<array_t> a,其中array_t是一个结构体,由一个简单的数组组成(我不认为这是bug的实际来源)。什么好主意吗?
提前谢谢。

注:答案已被编辑以修复一个错别字(第13行用p代替ptr)。

当然,您会得到一个错误,因为shared_ptr< T* >不能被强制转换为shared_ptr< void* >,除非Tvoid。为了解决这个问题,您可以在shared_ptr类中添加一个强制转换操作符,它将把任何类型强制转换为shared_ptr< void* >

出现错误的那一行指的是没有声明的p。你是说ptr吗?