缺少合适的构造函数

时间:2014-11-26 11:45:29

标签: constructor copy-constructor implicit-conversion

我有以下课程(这不是我真正的课程,但仅用于说明目的):

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"到"号码"

void test_error(){
    Number z = 3;
}

如果我评论单词" explicit"从第二个构造函数,然后编译器错误消失,显然自动转换工作正常。因为我想保留关键字" explicit",我错过了哪个构造函数?

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

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

简而言之,如果您想保留explicit关键字,则无法使用其他构造函数。无论你做什么,都会禁止隐含的类型转换。