Я надеюсь, что кто-то может дать мне техническую информацию о том, почему следующее не будет компилироваться, и, если возможно, обойти это.
У меня есть существующая структура с именем Foo, и код, который использует списки инициализатора длясоздавать экземпляры Foo.Этот код компилируется и работает:
struct Foo {
int id1;
int id2;
};
int main()
{
Foo f({1,2});
return f.id1;
}
Я бы хотел, чтобы Foo реализовал интерфейс в будущем:
struct Interface {
// All pure virtual methods, but this won't compile even if empty
};
struct Foo : public Interface{
int id1;
int id2;
};
int main()
{
Foo f({1,2});
return f.id1;
}
Этот код больше не компилируется, с ошибками в
cannot convert argument 1 from 'initializer list' to 'const _Ty &'
(Ошибка изменяется в зависимости от вашего точного компилятора.)
Я нашел этот раздел стандарта, касающийся инициализации агрегата:
[dcl.init.aggr] / 1 Агрегат - это массив или класс (раздел 12), в котором 1.1 нет пользовательских, явных или унаследованных конструкторов (15.1), 1.2 нет частных или защищенных нестатических элементов данных (пункт 14), 1.3 нет виртуальных функций(13.3) и 1.4 нет виртуальных, частных или защищенных базовых классов (13.1).
Хотя на самом деле я не уверен, что здесь происходит агрегатная инициализация.Может кто-нибудь объяснить возникшую ошибку и, если возможно, предложить изменения, которые я мог бы внести в интерфейс?У меня есть несколько существующих структур, которым нужен этот интерфейс, и много существующего кода, который использует эту форму инициализации, и я хотел бы переписать как можно меньше.Спасибо!