C++ &引用;错误:没有匹配的函数用于调用";构造函数错误

C++ &引用;错误:没有匹配的函数用于调用";构造函数错误,c++,class,oop,constructor,circuit,C++,Class,Oop,Constructor,Circuit,我正试图构造一个电路模拟器,但遇到了一些固有的错误。我想我只是感到困惑,因为我已经盯着它看了太久了,所以我希望能得到一些帮助 错误消息: 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,

我正试图构造一个电路模拟器,但遇到了一些固有的错误。我想我只是感到困惑,因为我已经盯着它看了太久了,所以我希望能得到一些帮助

错误消息:

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

};
类二进制门:公共逻辑元素{ 公众: 二进制_门(字符串s):逻辑_元素、位a_状态(false)、位b_状态(false){}; bool get_bitA(){ 如果(!bitA_状态){ cout>bitA; 比特状态=真; } 返回bitA; } bool get_bitB(){ 如果(!bitB_状态){ cout>bitB; bitB_状态=真; } 返回bitB; } 无效集合(布尔值){ bitA=val; 比特状态=真; } 无效集\u位(布尔值){ bitB=val; bitB_状态=真; } bool get_statusA(){ 返回bitA_状态; } bool get_statusB(){ 返回bitB_状态; } 虚拟空集\u下一个\u位(bool from \u位){ 如果(!bitA_状态){ bitA=从_位开始; 此->比特状态=真; } 如果(!bitB_状态){ bitB=从_位开始; 此->比特状态=真; } } 受保护的: 布尔比塔; 布尔比特; bool bitA_status;//true=take,false=empty bool bitB_status;//true=take,false=empty }; 请记住,在我为wire添加第二个构造函数之前,代码是有效的,它接受bool和二进制门

我推断错误来自wire类中的第二个构造函数。这让我很困惑,因为它与第一个构造函数非常相似,我所做的只是传递一个bool输入,可以说它应该更易于编码


谢谢

您的
wire
类有4个成员变量。每一个都需要在
导线的构建过程中构建

wire(bool &from, binary_gate &to) : bit_output(from), gate_input(to)
说明如何构造
位输出
门输入
,而不是
位输入
门输出
。为这些函数调用默认构造函数。但是对于
gate\u-input
类型的
binary\u-gate
没有默认构造函数

二进制门
类中为
二进制门
声明公共默认构造函数

binary_gate() = default;


如果希望默认的
二进制门
具有其他特定值。

问题在于
wire
类的第二个构造函数:

wire(bool&from,二进制门&to):位输出(from),门输入(to){
设置下一位(从);
}
需要为
二进制门
调用默认构造函数,为
门输出
成员调用默认构造函数。。。而且您还没有提供默认构造函数(即没有参数的构造函数)。这是因为,一旦为构造函数提供了不同的签名(如
二进制门(字符串s)
),编译器就不再提供隐式默认值。来自(我的):

如果没有为类类型(struct、class或union)提供任何类型的用户声明构造函数,编译器将始终声明 默认构造函数作为其类的内联公共成员

但是,
wire
类的另一个构造函数对
gate\u输入
gate\u输出
都使用复制构造函数,编译器确实为此提供了默认值。同样,来自:

如果没有为类类型提供用户定义的副本构造函数 (结构、类或联合),编译器将始终声明一个副本 构造函数作为其类的非显式内联公共成员

为了解决这个问题,您需要显式地设置一个默认构造函数(没有参数);最简单的方法如下:

类二进制门:公共逻辑元素{ 公众: 二进制_门(字符串s):逻辑_元素、位a_状态(false)、位b_状态(false){}; binary_gate()=default;//提供一个*显式*默认构造函数。 //...

请随时要求进一步澄清和/或解释。

感谢您的快速回复。原来我不知道复制构造函数是什么,所以我想我真正的困惑应该是为什么第一个构造函数可以工作!您的回复澄清了很多问题。再次感谢。
binary_gate() : ...initialization list... {}