呼叫没有匹配功能,但为什么?

时间:2015-11-01 21:26:25

标签: c++ pointers constructor smart-pointers default-constructor

我几乎完成了我的智能指针,所以我将它上传到我的大学网站,该网站对我的代码进行了大量自动化测试。

问题是我不知道正在进行什么样的测试。我能够阅读我所做的自动测试的标准输出:

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()构造函数?这是我的智能指针类:

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 refcounted {
private:
    int count;
public:
    refcounted() : count(0) { }

    int incRefCnt() {
        return ++count;
    }

    int decRefCnt() {
        return --count;
    }
};

你能看到代码有什么问题吗?提前谢谢!

1 个答案:

答案 0 :(得分:1)

它说的是什么。

您正在 string hostname = string.Empty; string mac = string.Empty; try { IPHostEntry ipEntry = Dns.GetHostEntry(IPAddress.Parse(ip)); if (ipEntry != null) hostname = ipEntry.HostName; }catch(SocketException se) { hostname = "Unknown Host name !"; } (即new T()),但new tester()内没有默认构造函数。

在不知道任务约束的情况下,无法提出解决方案。

但是,通常,您在智能指针构造函数中接受tester,这样调用站点可能负责[动态]构建它,但是需要它。 (另一种选择是变量模板构造函数,有效地模仿标准&#34;就地构造。)

你似乎已经这样做了,所以你可以尝试完全删除默认构造函数......但很明显,部分任务需要它,否则就不会被调用。

通常,默认构造的智能指针基本上什么都不做。你可以试试。