[英]Calling automatic constructor: why is my type incomplete?
在下面的代码中,我想使用默认构造函数{.data = value}
,因为我希望我的类是POD。 我不明白我在编译时遇到的错误信息(llvm或gnu,c ++ 11):
#include <type_traits>
class a {
char data;
static inline a create(char c) { return {.data = c}; } // this fails
static inline a create2(char c) { a x; x.data = c; return x; } // this is OK
public:
void init(char c) { *this = create(c); }
};
int main() {
a s;
s.init('x');
return std::is_pod<a>::value;
}
有错误消息
t.cc:5:43: error: no matching constructor for initialization of 'a'
static inline a create(char c) { return {.data = c}; }
^~~~~~~~~~~
t.cc:3:7: note: candidate constructor (the implicit copy constructor) not viable: cannot convert
argument of incomplete type 'void' to 'const a &'
有些灵魂可以向我解释为什么当我想使用它时,a的类型是不完整的,为什么它被视为void
?
您无法聚合初始化私有成员。
来自https://en.cppreference.com/w/cpp/language/aggregate_initialization
聚合是以下类型之一:...类类型(通常是struct或union),没有私有或受保护的非静态数据成员
由于a
是class
,而不是struct
,因此data
是private
。
将data
声明为public
data
,或将类型声明为struct
以将其默认为public
。
然后将static inline a create(char c) { return {.data = c}; }
替换static inline a create(char c) { return {.data = c}; }
static inline a create(char c) { return {.data = c}; }
with static inline a create(char c) { return a { c }; }
static inline a create(char c) { return a { c }; }
根据https://en.cppreference.com/w/cpp/language/list_initialization
直接列表初始化(2)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.