Рекомендуется не задавать несколько вопросов в одном посте.
Сложно дать вам краткий ответ.
На ваш первый вопрос:
Возвращение T GetFields()
является временной копией внутреннего члена mfield
.
Компилятор предупреждает вас, что вы пытаетесь редактировать временное значение.
В порядкечтобы сделать эту работу закодированной, вам нужно обновить сигнатуру T GetFields()
до T& GetFields()
, чтобы она возвращала ссылку во внутреннее поле вместо copy .
На ваш второй вопрос:
Вы не можете сделать полиморфизм подобным образом.Интерфейс не знает, что такое Fields
.Вытяните структуру Fields из A, чтобы все могли видеть ее правильно и / или сделать ее частью параметров шаблона.
Обновление: после обсуждения вещей в комментариях может показаться, что вы пытаетесь спроектировать свои данныеструктуры наизнанку, и это просто не скомпилируется.
В этом конкретном случае структура данных, указанная в классе A
, имеет тип A::Fields
, но Interface
указывает, что Interface::GetFields()
возвращаетадрес объекта типа Fields
, для которого A::Fields
не является.
Для того, чтобы ваша текущая конфигурация работала, вам нужно будет сделать A::Fields
классом, производным от Fields
, и если выиметь другой класс B
, который определяет конкретную структуру Fields
, для выполнения любой функции, вызывающей Interface::GetFields()
, потребуется выполнить самоанализ типа времени выполнения (RTTI), используя dynamic_cast
или typeid
, чтобы определить, имеет ли она A::Fields
или B::Fields
до доступа к его элементам, чтобы избежать чтения вне памяти структуры данных и не вызвать ошибку сегментации.