簡體   English   中英

“錯誤:沒有匹配的調用函數”構造函數錯誤

[英]"error: no matching function for call to" constructor errror

我試圖構建一個電路模擬器並遇到一些具有繼承性的錯誤。 我想我只是很困惑,因為我盯着它看得太久了,所以希望得到一些幫助。

錯誤信息:

prep_3.cpp: In constructor 'wire::wire(bool&, binary_gate&)':
prep_3.cpp:147:70: error: no matching function for call to 'binary_gate::binary_gate()'
   wire(bool &from, binary_gate &to) : bit_output(from), gate_input(to) {
                                                                      ^

導致問題的類:

class wire{
    public : 
        wire(binary_gate &from, binary_gate &to) : gate_output(from), gate_input(to) {
            //want to pass output of from into to.
            //therefore must set_next_bit of to taking the input as the output of from
            to.set_next_bit(from.get_output()); 
        }

        wire(bool &from, binary_gate &to) : bit_output(from), gate_input(to) {
            to.set_next_bit(from); 
        }

    private : 
        binary_gate gate_output, gate_input; 
        bool bit_output, bit_input; 
}; 

二元門類:

class binary_gate : public logic_element{
    public : 
    binary_gate(string s) : logic_element(s), bitA_status(false), bitB_status(false){}; 

    bool get_bitA(){
        if(!bitA_status){
            cout << "A hasn't been assigned yet! please set it : " ; 
            cin >> bitA; 
            bitA_status = true; 
        }
        return bitA; 
    }

    bool get_bitB(){
        if(!bitB_status){
            cout << "B hasn't been assigned yet! please set it : " ; 
            cin >> bitB; 
            bitB_status = true; 
        }
        return bitB; 
    }

    void set_bitA(bool val){
        bitA = val; 
        bitA_status = true; 
    }

    void set_bitB(bool val){
        bitB = val; 
        bitB_status = true; 
    }

    bool get_statusA(){
        return bitA_status; 
    }


    bool get_statusB(){
        return bitB_status; 
    }

    virtual void set_next_bit(bool from_bit){ 
        if(!bitA_status){ 
            bitA = from_bit;
            this->bitA_status = true; 
        }
        else if(!bitB_status){ 
            bitB = from_bit; 
            this->bitB_status = true;           
        }
    }

    protected: 
        bool bitA;
        bool bitB; 
        bool bitA_status; // true = taken, false = empty
        bool bitB_status; // true = taken, false = empty

};

請記住,在我為 wire 添加第二個構造函數之前,代碼是有效的,它接受一個 bool 和一個 binary_gate。

我推斷該錯誤來自 wire 類中的第二個構造函數。 這讓我感到困惑,因為它與第一個構造函數非常相似,我所做的只是傳遞一個 bool 輸入,可以說它應該更容易編碼!

謝謝

您的wire類有 4 個成員變量。 這些中的每一個都需要在構建wire過程中構建。

wire(bool &from, binary_gate &to) : bit_output(from), gate_input(to)

提供有關如何構造bit_outputgate_input ,但不說明如何構造bit_inputgate_output 為這些調用默認構造函數。 但是您沒有類型為gate_input的默認構造binary_gate

binary_gate類中為binary_gate聲明一個公共默認構造函數

binary_gate() = default;

或者

binary_gate() : ...initialization list... {}

如果您希望默認的binary_gate具有其他特定值。

問題是您的wire類的第二個構造函數:

wire(bool &from, binary_gate &to) : bit_output(from), gate_input(to) {
    to.set_next_bit(from); 
}

需要為binary_gate調用默認構造binary_gate ,為gate_output成員...而您還沒有提供默認構造函數(即沒有參數的構造函數)。 這是因為,一旦您提供具有不同簽名的構造函數(如binary_gate(string s) ),編譯器就不再提供隱式默認值。 來自cppreference (我的粗體):

如果沒有為類類型(結構、類或聯合)提供任何類型的用戶聲明的構造函數,編譯器將始終將默認構造函數聲明為其類的內聯公共成員。

但是, wire類的另一個構造函數使用了gate_inputgate_output復制構造gate_output ,並且編譯器確實為此提供了默認值。 同樣,來自cppreference

如果沒有為類類型(結構、類或聯合)提供用戶定義的復制構造函數,編譯器將始終將復制構造函數聲明為其類的非顯式內聯公共成員。

為了解決這個問題,您需要顯式設置一個默認構造函數(不帶參數); 最簡單的方法如下:

class binary_gate : public logic_element{
    public : 
    binary_gate(string s) : logic_element(s), bitA_status(false), bitB_status(false){}; 
    binary_gate() = default; // Provide an *explicit* default constructor.
    //...

隨時要求進一步澄清和/或解釋。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM