помогите инициализировать двухмерный массив

Делаю вот так :

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 } } ;
→ Ссылка