помогите инициализировать двухмерный массив
Делаю вот так :
constexpr int A = 2;
constexpr int B = 5;
struct prasetoReplace {
std::wstring find;
std::wstring replace;
};
extern const std::array <std::array<prasetoReplace, A>,B> aaa;
хочу aaa проинициализировать в другом файле. поэтому пытаюсь так :
const std::array <std::array<prasetoReplace, A>, B> aaa =
{
{{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"}},
{ {L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"}},
{ {L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"}},
{ {L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"}}
{ {L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"}}
};
но не выходит )) что я делаю не так ?
Ответы (1 шт):
Автор решения: AlexGlebe
→ Ссылка
Фигурный скобки при иницализации переменной основываются на его типе. А если приведены очень много вложенных друг в друга скобок, то автоматическое определение типов не работает. Нужно указывать компилятору какой именно тип вы имеете в виду.
# include <string>
# include <array>
constexpr int A = 2;
constexpr int B = 5;
struct prasetoReplace {
std::wstring find;
std::wstring replace;
};
extern const std::array <std::array<prasetoReplace, A>,B> aaa;
const std::array <std::array<prasetoReplace, A>, B> aaa = {
std::array<prasetoReplace, A> {
prasetoReplace {L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"}},
{ prasetoReplace {L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"}},
{ prasetoReplace {L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"}},
{ prasetoReplace {L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"}},
{ prasetoReplace {L"1 ракушек", L"1 ракушку"},{L"1 ракушек", L"1 ракушку"}}};
Чтобы понять проблему : вот минимальный пример неоднозначности выполнения конструктора.
class A{
public:
A(int x):i{x}{}
int i;
};
class B{
public:
B(int x):i{x}{}
int i;
};
class C{
public:
C(A a):i{a.i}{}
C(B b):i{b.i}{}
int i;
};
// error: call of overloaded 'C(<brace-enclosed initializer list>)' is ambiguous
// вызов конструктора неоднозначен : или A или B
// C c0 { { 0 } } ;
C c1 { A { 1 } } ;
C c2 { B { 2 } } ;