这段代码编译并运行在GCC 3.x和4.x预期:
#include <stdio.h>
typedef union buggedUnion
{
public:
// 4 var init constructor
inline buggedUnion(int _i) {
i = _i;
}
friend inline const buggedUnion operator - (int A, const buggedUnion &B) {
return buggedUnion(A - B.i);
}
friend inline const buggedUnion operator - (const buggedUnion &A, const buggedUnion &B) {
return buggedUnion(A.i - B.i);
}
int i;
} buggedUnion;
int main()
{
buggedUnion first(10);
buggedUnion second(5);
buggedUnion result = 10 - (first - second);
printf("%d\n", result.i); // 0
return 0;
}
MSVC,但是,不会编译代码,抱怨:
main.cpp(60) : error C3767: '-': candidate function(s) not accessible
could be the friend function at 'main.cpp(41)' : '-' [may be found via argument-dependent lookup]
or the friend function at 'main.cpp(45)' : '-' [may be found via argument-dependent lookup]
main.cpp(60) : error C2676: binary '-' : 'buggedUnion' does not define this operator or a conversion to a type acceptable to the predefined operator
其编译器是正确的? 这又如何解决? 我试图达到清洁的代码(没有外界朋友的方法),同时保持便携性,灵活性和自我记录代码。
一些注意事项:
- 这是一个测试案例来说明问题,原来的数据类型更加复杂和精心设计的,尽管在MSVC不工作(主要编译器GCC,虽然MSVC的兼容性也需要)。
- 增加“市民:”在联合声明的开头不能解决它。
- 增加“市民:”以前每个操作员不解决这个问题
- 测试用例转换到结构/类完成修复它,但这是不希望的(请无火焰,我得到的原因。他们中的大多数是C的限制++语言)
- 是在全局范围内进行操作者左方法(不是成员函数)
最佳的解决方案将不依赖于移动联盟定义aestetic原因(超过24符和操作数的不同组合)外的声明,但如果没有其他的解决方案来实现。