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