В следующем коде я хочу использовать конструктор по умолчанию {.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 &'
Может ли какая-то добрая душа объяснить мне, почему тип а неполный, когда я хочу его использовать, и почему он рассматривается как void
?