class __declspec(dllexport) DI_1
{
DI_1& operator = (DI_1 &){};
};
class DI_2
{
DI_2& operator = (DI_2 &){};
};
int main()
{
DI_1 a;
DI_2 b;
return 0;
}
使用VS 2010/2012
编译时,以下代码会出现以下错误:
错误C4716:'DI_1 :: operator =':必须返回值
虽然我希望它也为DI_2
类返回相同的错误。
这是一个编译器错误,而不是将DI_2
类标记为错误吗?
如果没有,有人可以解释原因吗?
编辑: 我在Solaris Compiler中确认,它会为这两个类抛出错误。
答案 0 :(得分:0)
从二进制模块导出类不应该有任何区别。在您的示例中,我也没有看到任何语义差异。
然而,糟糕的错误报告无可比拟的问题而不是错误的代码生成。每个合理的编译器开发者都将遵循此规则这是解释。
P.S。在模板实例化期间,仅生成那些被调用的方法。其他方法(以及它们中潜在的语法错误)将被忽略。相反,对于AFAIK类,通常会生成所有方法。我不知道这种不对称的充分理由。也许MS编译器正朝这个方向做点什么。