在构造函数中传递类成员时出现C ++语法错误

时间:2013-05-13 06:15:12

标签: c++ templates

我需要写一种shared_ptr<>在C ++中。但是,我现在正在努力解决一个奇怪的错误 以下代码:

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&lt; _Ty1,_Ty2&gt; :: pair:2个重载中没有一个可以转换所有参数类型'(实际上是第13行中的C2665)。
顺便说一下,shared_ptr在main()中被实例化为shared_ptr<array_t> a,其中array_t是一个只包含一个简单数组的结构(我不认为这是bug的实际来源) 。任何想法?
提前谢谢。

P.S。答案已被编辑以修正拼写错误(p而不是第13行的ptr)。

2 个答案:

答案 0 :(得分:2)

当然,您会收到错误,因为shared_ptr< T* >无法投放到shared_ptr< void* >T除外void。要解决此问题,您可以向shared_ptr类添加一个强制转换操作符,将任何类型转换为shared_ptr< void* >

答案 1 :(得分:0)

带错误的行是指尚未声明的p。您的意思是说ptr吗?