![](/img/trans.png)
[英]error: no matching function for call to ‘constructor’ note: candidates are:
[英]"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_output
和gate_input
,但不說明如何構造bit_input
和gate_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_input
和gate_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.