Трудно сказать, какой из них правильный, так как неназванные struct
s не разрешены стандартом (хотя они являются распространенным расширением), и, как таковая, программа плохо сформирована.
Редактировать : Это похоже на ошибку в msvc, так как следующий код, который является абсолютно допустимым, не компилируется.
union buggedUnion
{
friend buggedUnion operator - (int A, const buggedUnion &B) {
return B;
}
friend buggedUnion operator - (const buggedUnion &A, const buggedUnion &B) {
return A;
}
int i;
};
int main()
{
buggedUnion first = { 1 };
buggedUnion second = { 1 };
buggedUnion result = 3 - (first - second);
}
Вы можете обойти это, определив функции вне класса.
union buggedUnion
{
int i;
};
buggedUnion operator - (int A, const buggedUnion &B) {
return B;
}
buggedUnion operator - (const buggedUnion &A, const buggedUnion &B) {
return A;
}
Вы даже можете сохранить статус друга, объявив функции внутри класса (но все же определив их снаружи), но я сомневаюсь, что вам когда-нибудь понадобится это в союзе.
Обратите внимание, что я удалил ненужные typedef
и inline
s.