У меня есть несколько классов объединения (union_a, union_b, …), все с одинаковыми членами данных и
различные функции-члены.
Я хочу иметь возможность назначить объект любого класса для объекта любого другого класса, и
используйте его в любом ctor для init.
«Рабочий» union union_z используется в качестве посредника.
Все отлично работает в ВК.
В GC последняя строка получает «ошибка: запрошено преобразование из« union_a »в нескалярный тип« union_b »».
Помоги мне, если сможешь, я …
union union_z{int m;};
union union_a{
int m;
union_a(){}
union_a(union_z x){m = x.m;}
void operator=(union_z x){m = x.m;}
operator union_z(){return *(union_z *)this;}
};
union union_b{
int m;
union_b(){}
union_b(union_z x){m = x.m;}
void operator=(union_z x){m = x.m;}
operator union_z(){return *(union_z *)this;}
};
union_a a;
union_b b(a);
b = a;
union_b b1 = a; //error: conversion from ‘union_a’ to non-scalar type ‘union_b’ requested
G ++ это правильно. Формальный синтаксис инициализации копии заключается в
преобразовать выражение справа от =
к цели
введите, а затем скопируйте его. Что в этом случае предполагает неявное
преобразование из union_a
в union_b
, И нет ни одного;
единственное преобразование потребует двух определенных пользователем преобразований,
и два пользовательских преобразования никогда не могут быть использованы в
неявное преобразование.
См. §8.5 / 16 и §13.3.1.4 (C ++ 11, но правила, предусматривающие это
не изменились в отношении более ранних версий).
Других решений пока нет …