【问题标题】:Missing suitable constructor缺少合适的构造函数
【发布时间】:2014-11-26 11:45:28
【问题描述】:

我有以下课程(这不是我真正的课程,只是为了说明目的):

class Number {
public:
    Number() : value_(0) {}

    explicit Number(int v) : value_(v) {}

    Number(const Number & other){
        value_ = other.value_;
    }

    Number& operator=(const int & v){
        value_ = v;
        return *this;
    }

private:
    int value_;
};

我可以执行以下操作,并且它们都可以正常工作:

void test_ok(){
    Number x(3);
    Number y = Number(3);
    Number y2(x);
    Number y3 = x;
    Number u;
    u = 3;
}

但是,以下给出了此编译器错误:不存在合适的构造函数来将“int”转换为“Number”

void test_error(){
    Number z = 3;
}

如果我从第二个构造函数中注释“显式”这个词,那么编译器错误就消失了,显然自动转换工作正常。由于我想保留关键字“显式”,所以我缺少哪个构造函数?

提前致谢!

【问题讨论】:

    标签: constructor copy-constructor implicit-conversion


    【解决方案1】:

    explicit 关键字禁止隐式自动类型转换。在您的测试Number z = 3 中,您正是这样做的——隐式类型转换,从int (3) 到Number。编译器正确地禁止了这一点。

    如果您想保留关键字explicit,那么您必须将Number 对象构造为Number(3)(正如您已经注意到并编写的那样)。

    简而言之,如果您想保留explicit 关键字,则没有其他可以使用的构造函数。无论您做什么,都将禁止隐式类型转换。

    【讨论】:

    • 谢谢,所以我想这是不可能的。我只是想知道当我删除 关键字时哪个默认转换正在使用编译器,以及是否可以重载它。
    • 通过删除关键字explicit 允许的隐式转换是将3 类型转换为Number。当您使用 Number z = static_cast<Number>(3); 时,您会得到相同的行为,在这种情况下,您可以保留 explicit 关键字,因为好吧..您自己明确地处理类型转换 ;-)
    猜你喜欢
    • 2022-06-29
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 1970-01-01
    • 2022-10-13
    • 2018-06-23
    • 2017-07-21
    • 1970-01-01
    相关资源
    最近更新 更多