0

我幾乎完成了我的智能指針,所以我將它上傳到我的大學網站,該網站對我的代碼進行了大量自動化測試。呼叫沒有匹配的功能,但爲什麼?

事情是我不知道什麼樣的測試正在被執行。我能看懂的自動化測試的stdout,我做到了:

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

這就是它說的。

你在做new T()(即new tester()),但tester裏面沒有默認構造函數。

如果不知道任務的約束條件,就不可能提出解決方案。

但是,通常情況下,您會接受T*進入智能指針構造函數,以便調用站點可能負責[動態]構造它,但這是必需的。 (另一種替代方案是可變模板構造函數,有效地模仿標準「就地」構造。)

您似乎已經這樣做了,所以您可以嘗試完全刪除默認構造函數&hellip;但顯然有一部分任務需要它,否則就不會被調用。

通常情況下,默認構造的智能指針本質上什麼都不會做。你可以試試。

+0

這是問題,謝謝。你真的打開了我的眼睛:)我現在只有一個問題:在一個測試中有空指針異常或類似的地方。 – masm64

+0

@ masm64:這似乎完全無關於這個特定的問題。 –

+0

是的,但我討厭這個自動化的東西lel :) – masm64

相關問題