c++11 struct initialization compilation error
c++, c++11
Solution
In C++11, when you use non static data member initialization at the point of declaration like you do here:
struct SS {int a = 0; int s = 2;};
you make the class a non-aggregate. This means you can no longer initialize an instance like this:
SS s{1,2};
To make this initialization syntax work for a non-aggregate, you would have to add a two-parameter constructor:
struct SS
{
SS(int a, int s) : a(a), s(s) {}
int a = 0;
int s = 2;
};
This restriction has been lifted in C++14.
Note that you may want to add a default constructor for the class. The presence of a user-provided constructor inhibits the compiler generated default one.
See related reading here.
Problem
``` struct SS {int a; int s;}; int main () { vector<SS> v; v.push_back(SS{1, 2}); } ``` The code can be compiled without any error. However, when the struct is initialized in class, I got compilation error. Can anyone explain it? ``` struct SS {int a = 0; int s = 2;}; ``` Error: ``` In function ‘int main()’: error: no matching function for call to ‘SS::SS(<brace-enclosed initializer list>)’ v.push_back(SS{1, 2}); ^ note: candidates are: note: constexpr SS::SS() struct SS {int a = 0; int s = 2;}; ^ note: candidate expects 0 arguments, 2 provided note: constexpr SS::SS(const SS&) note: candidate expects 1 argument, 2 provided note: constexpr SS::SS(SS&&) note: candidate expects 1 argument, 2 provided ```