【发布时间】:2014-07-21 10:33:41
【问题描述】:
struct B {
int b;
B(int i = 0) : b(i) {}; // constructor
};
struct D : B {
int d;
};
int main () {
D obj = {1}; // <-- error
// D obj {1}; // <-- error (different)
}
以上代码无法编译,并给出:
error: could not convert ‘{1}’ from ‘<brace-enclosed initializer list>’ to ‘D’
即使我删除“构造函数”行也是如此。
如果我删除= 符号,即D obj {1};,那么它会给出以下信息:
error: no matching function for call to ‘D::D(<brace-enclosed initializer list>)’
解决此类问题的正确语法是什么?
【问题讨论】:
-
您是否希望它默认构造
B并使用1初始化d?或者用1初始化B并让d未初始化?无论哪种方式,您都需要一个构造函数来解决歧义(或默认构造它,然后将成员设置为您想要的)。大括号初始化仅适用于具有匹配构造函数的聚合或类。 -
@MikeSeymour,即使我们删除
struct B中的“constructor”行,错误仍然存在。 -
当然可以。正如我所说,“大括号初始化仅适用于具有匹配构造函数的聚合或类”。您需要给
D一个合适的构造函数,或者默认构造它并在构造后设置它的成员。
标签: c++ inheritance c++11 compiler-errors list-initialization