我编写了一个智能指针类。当我将其传递给向量时,在编译时会显示一些错误消息。但是我删除了显式声明后,它就可以了。怎么了

explicit shared_ptr(const shared_ptr<T>& sp)



  没有匹配的函数调用shared_ptr<int>::shared_ptr(const shared_ptr<int> &)


 #include <iostream>
    #include <vector>
    using namespace std;




    template<class T>
    class shared_ptr {
    private:
      struct ptr {
        T* ptr;
        size_t count;
        void release() {
          if(-- count == 0) {
            delete ptr;
            delete this;
          }
        }
      };
    private:
      ptr* _ptr;
    public:
      explicit shared_ptr(T* p):
        _ptr(new ptr) {
        _ptr->ptr = p;
        _ptr->count = 1;
      }
      explicit shared_ptr(const shared_ptr<T>& sp):
      //explicit shared_ptr(const shared_ptr& sp):
        _ptr(sp._ptr) {
        ++ _ptr->count;
      }
      shared_ptr<T>& operator=(const shared_ptr<T>& sp) {
        _ptr->release();
        _ptr = sp._ptr;
        ++ _ptr->count;
        return *this;
      }

      shared_ptr<T>& operator=(T* p) {
        _ptr->release();
        _ptr = new ptr;
        _ptr->count = 1;
        _ptr->ptr = p;
      }

      T* get() {
           return _ptr->ptr;
      }

      T& operator*() {
        return *(_ptr->ptr);
      }

      T* operator->() {
          return _ptr->ptr;
      }


      ~shared_ptr() {
        _ptr->release();
      }


    };



    int main() {
        vector<shared_ptr<int> > vec;
        vec.push_back(shared_ptr<int>(new int(10)));
    }

最佳答案

声明为explicit的构造函数只能在显式调用它时使用。在这一行:

vec.push_back(shared_ptr<int>(new int(10)));


您正在将值传递给vec,在标准库的C ++ 03实现中,该值最终被复制到向量中,并进行复制初始化,例如:

_Tp __x_copy = __x;


这里对复制构造函数的调用是隐式的,但是您的构造函数被标记为explicit。因此,错误。

请注意,该错误仅在C ++ 03编译器或使用-std=c++03标志进行编译时发生,因为在C ++ 11中使用rvalue参数调用push_back()函数(例如您要实例化的临时变量)最终将通过显式调用复制构造函数在适当位置创建值。

因此,我假设您正在使用C ++ 03编译器。

通常,explicit构造函数是采用一个参数的构造函数,而不是复制构造函数,以避免麻烦的隐式转换(实际上,在C ++ 11中,explicit对于采用多个参数的构造函数也很有意义,因为通过括号初始化器列表进行了复制初始化)。

复制构造函数通常不声明为explicit

关于c++ - 当我声明构造函数为显式编译错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15310655/

10-13 08:27
查看更多