Заполнить класс с пользовательскими конструкторами в объединение - PullRequest
4 голосов
/ 27 сентября 2010
class Foo {
    Foo(int val) { /* Do some initialization */ }
    Foo() { /* Do nothing */ }
};
union Bar {
    Foo foo;
};

Этот код генерирует эту ошибку:

ошибка C2620: член 'Bar :: foo' объединения 'Bar' имеет пользовательский конструктор или нетривиальный конструктор по умолчанию

Я понимаю, почему вы бы выдавали эту ошибку, если конструктор действительно что-то сделал, но конструктор здесь не принимает параметров и ничего не делает.Есть ли способ, как я могу собрать этот класс в союз?Мне пришлось пройти весь путь до char foo[sizeof(Foo)] и я бы хотел более чистое решение.

Ответы [ 4 ]

6 голосов
/ 27 сентября 2010

Первоначально из этого вопроса:

Инициализация объединения с нетривиальным конструктором :

Из C ++ 03, 9.5 Союзы, стр. 162

Объединение может иметь функции-члены (включая конструкторы и деструкторы), но не виртуальные (10.3) функции.У союза не должно быть базовых классов.Объединение не должно использоваться в качестве базового класса. Объект класса с нетривиальным конструктором (12.1), нетривиальным конструктором копирования (12.8), нетривиальным деструктором (12.4) или нетривиальнымоператор присвоения копии (13.5.3, 12.8) не может быть членом объединения, а также не может содержать массив таких объектов

Таким образом, вашему классу запрещено быть членом объединения.

3 голосов
/ 27 сентября 2010

Это не разрешено в стандарте C ++ 03.

Если объекты с определенными пользователем конструкторами по умолчанию были разрешены в объединении, компилятор не мог решить, какой конструктор использовать, потому что все ссылаются на одну и ту же область памяти. Таким образом, объекты с определенными пользователем конструкторами не допускаются в объединениях.

Компилятор будет игнорировать тот факт, что ваш конструктор ничего не делает, потому что он может быть определен не в объединении, а в другом месте.

Вы можете сойти с C ++ 0x constructor() = default;

1 голос
/ 27 сентября 2010

Специалисты по стандарту, скорее всего, ответят на этот вопрос более точно, чем я, но если я правильно помню, члены профсоюза должны быть типа POD.

Используйте boost::variant, если вы хотите использовать классы не PODвнутри союза.

0 голосов
/ 27 сентября 2010

Если в вашем классе есть пользовательский конструктор, деструктор или конструктор копирования или оператор присваивания, он не может быть внутри Union.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...