call没有匹配函数,为什么?
No matching function for call, but why?
我快完成我的智能指针了,所以我将它上传到我大学的网站,该网站对我的代码运行了一些自动化测试。
问题是我不知道正在执行哪种测试。我能够读取我所做的自动化测试的标准输出:
In instantiation of ‘my_pointer<T>::my_pointer() [with T = tester]’:
error: no matching function for call to ‘tester::tester()’
note: candidates are:
tester::tester(my_pointer<tester>)
candidate expects 1 argument, 0 provided
tester::tester(const tester&)
candidate expects 1 argument, 0 provided
所以我猜出于某些奇怪的原因它不会调用我的 my_pointer() 构造函数?这是我的智能指针 class:
template<class T>
class my_pointer {
T* raw_pointer;
public:
my_pointer() {
raw_pointer = new T();
raw_pointer->incRefCnt();
}
my_pointer(T *obj) : raw_pointer(obj) {
if(raw_pointer != NULL) raw_pointer->incRefCnt();
}
my_pointer(const my_pointer<T>& smart_pointer) : raw_pointer(smart_pointer.raw_pointer) {
if(raw_pointer != NULL) raw_pointer->incRefCnt();
}
T& operator*() {
return *raw_pointer;
}
T* operator->() {
return raw_pointer;
}
operator T*() {
return raw_pointer;
}
my_pointer<T> &operator=(const my_pointer<T> &smart_pointer) {
if(this != &smart_pointer && raw_pointer != NULL) {
/** if this was the last reference to the given memory address */
if (raw_pointer->decRefCnt() == 0) {
delete raw_pointer;
}
raw_pointer = smart_pointer.raw_pointer;
raw_pointer->incRefCnt();
}
return *this;
}
bool operator== (const T* pointer) {
return raw_pointer == pointer;
}
bool operator!= (const T* pointer) {
return raw_pointer != pointer;
}
bool operator== (const my_pointer<T> &smart_pointer) {
return raw_pointer == smart_pointer.raw_pointer;
}
bool operator!= (const my_pointer<T> &smart_pointer) {
return raw_pointer != smart_pointer.raw_pointer;
}
~my_pointer() {
if(raw_pointer->decRefCnt() == 0 && raw_pointer != NULL) {
delete raw_pointer;
}
}
};
这是一篇class,其中引用可统计:
class refcounted {
private:
int count;
public:
refcounted() : count(0) { }
int incRefCnt() {
return ++count;
}
int decRefCnt() {
return --count;
}
};
你能看出代码有什么问题吗?提前致谢!
这就是它所说的。
你正在做new T()
(即new tester()
),但是tester
.
里面没有默认构造函数
在不了解作业约束的情况下不可能提出解决方案。
但是,一般来说,您会在智能指针构造函数中接受一个 T*
,这样调用站点可能会负责 [动态] 构造它,但是这是必需的。 (另一种方法是可变模板构造函数,有效地模仿标准 "in-place" 构造。)
你似乎已经在这样做了,所以你可以尝试完全删除默认构造函数……但显然赋值的某些部分需要它,否则它不会被调用。
通常默认构造的智能指针基本上什么都不做。你可以试试。
我快完成我的智能指针了,所以我将它上传到我大学的网站,该网站对我的代码运行了一些自动化测试。
问题是我不知道正在执行哪种测试。我能够读取我所做的自动化测试的标准输出:
In instantiation of ‘my_pointer<T>::my_pointer() [with T = tester]’:
error: no matching function for call to ‘tester::tester()’
note: candidates are:
tester::tester(my_pointer<tester>)
candidate expects 1 argument, 0 provided
tester::tester(const tester&)
candidate expects 1 argument, 0 provided
所以我猜出于某些奇怪的原因它不会调用我的 my_pointer() 构造函数?这是我的智能指针 class:
template<class T>
class my_pointer {
T* raw_pointer;
public:
my_pointer() {
raw_pointer = new T();
raw_pointer->incRefCnt();
}
my_pointer(T *obj) : raw_pointer(obj) {
if(raw_pointer != NULL) raw_pointer->incRefCnt();
}
my_pointer(const my_pointer<T>& smart_pointer) : raw_pointer(smart_pointer.raw_pointer) {
if(raw_pointer != NULL) raw_pointer->incRefCnt();
}
T& operator*() {
return *raw_pointer;
}
T* operator->() {
return raw_pointer;
}
operator T*() {
return raw_pointer;
}
my_pointer<T> &operator=(const my_pointer<T> &smart_pointer) {
if(this != &smart_pointer && raw_pointer != NULL) {
/** if this was the last reference to the given memory address */
if (raw_pointer->decRefCnt() == 0) {
delete raw_pointer;
}
raw_pointer = smart_pointer.raw_pointer;
raw_pointer->incRefCnt();
}
return *this;
}
bool operator== (const T* pointer) {
return raw_pointer == pointer;
}
bool operator!= (const T* pointer) {
return raw_pointer != pointer;
}
bool operator== (const my_pointer<T> &smart_pointer) {
return raw_pointer == smart_pointer.raw_pointer;
}
bool operator!= (const my_pointer<T> &smart_pointer) {
return raw_pointer != smart_pointer.raw_pointer;
}
~my_pointer() {
if(raw_pointer->decRefCnt() == 0 && raw_pointer != NULL) {
delete raw_pointer;
}
}
};
这是一篇class,其中引用可统计:
class refcounted {
private:
int count;
public:
refcounted() : count(0) { }
int incRefCnt() {
return ++count;
}
int decRefCnt() {
return --count;
}
};
你能看出代码有什么问题吗?提前致谢!
这就是它所说的。
你正在做new T()
(即new tester()
),但是tester
.
在不了解作业约束的情况下不可能提出解决方案。
但是,一般来说,您会在智能指针构造函数中接受一个 T*
,这样调用站点可能会负责 [动态] 构造它,但是这是必需的。 (另一种方法是可变模板构造函数,有效地模仿标准 "in-place" 构造。)
你似乎已经在这样做了,所以你可以尝试完全删除默认构造函数……但显然赋值的某些部分需要它,否则它不会被调用。
通常默认构造的智能指针基本上什么都不做。你可以试试。