I am trying to create a Look-Up Table for easy creation of objects with different values. For this I need a static std::array in my class filled with the data. It currently looks like this:
#include <iostream>
#include <array>
#include <string>
struct MyStruct{
std::string s;
int a;
int b;
};
class Arr{
public:
static constexpr std::array<MyStruct, 3> strArray{{{"a", 1,2}, {"b", 2,3}, {"c", 3,4}}};
};
constexpr std::array<MyStruct, 3> Arr::strArray;
int main()
{
for(auto i : Arr::a){
std::cout << i << std::endl;
}
std::cout << "With a struct:\n";
for(auto i : Arr::strArray){
std::cout << i.a << ", " << i.b << std::endl;
}
return 0;
}
It works fine, if I remove the std::string, but with the std::string I get the compile error
../staticArray/main.cpp:15:46: error: constexpr variable cannot have non-literal type 'const std::array<MyStruct, 3>'
static constexpr std::array<MyStruct, 3> strArray{{{"a", 1,2}, {"b", 2,3}, {"c", 3,4}}};
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/array:137:16: note: 'array<MyStruct, 3>' is not literal because it has data member '__elems_' of non-literal type 'value_type [3]'
value_type __elems_[_Size > 0 ? _Size : 1];
^
../staticArray/main.cpp:19:40: error: constexpr variable cannot have non-literal type 'const std::array<MyStruct, 3>'
constexpr std::array<MyStruct, 3> Arr::strArray;
^
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/array:137:16: note: 'array<MyStruct, 3>' is not literal because it has data member '__elems_' of non-literal type 'value_type [3]'
value_type __elems_[_Size > 0 ? _Size : 1];