我正在尝试使用Thinking in C ++ Vol 2进行以下练习,女巫说:
在以下代码中,类NonComparable没有operator =()。为什么HardLogic类的存在会导致编译错误,但SoftLogic不会?
#include <iostream>
using namespace std;
class NonComparable {};
struct HardLogic {
NonComparable nc1, nc2;
void compare()
{
return nc1 == nc2;
}
};
template<class T>
struct SoftLogic {
NonComparable nc1, nc2;
void noOp() {}
void compare()
{
nc1 == nc2;
}
};
int main()
{
SoftLogic<NonComparable> l;
l.noOp();
return 0;
}
1)HardLogic :: compare返回void但函数尝试返回int / bool
2)SoftLogic也有一些奇怪的东西(对我来说):nc1 == nc2。
3)练习说的是operator =(),但在代码中它使用的是operator ==()。
是错误吗?我发现在这样一本书的代码中出现如此多的错误很奇怪,所以我错过了什么?以前有没有人遇到这个练习?
答案 0 :(得分:5)
因为编译器不需要诊断永远无法实例化为有效特化的模板。它们仅在实际实例化时才需要诊断它们。他们是否更早地诊断它们只是一种实施的质量。
对于类模板的成员函数也是如此。如果您尝试调用l.compare()
,编译器将需要实例化成员函数,并且需要诊断错误。
一个好的编译器会在两种情况下都给出错误。
HardLogic :: compare返回void但函数尝试返回int / bool
由于未定义有问题的operator==
,您不知道它会返回什么。它可以返回void
,在这种情况下return nc1 == nc2;
会没问题。
是错误吗?我发现在这样一本书的代码中出现如此多的错误很奇怪,所以我错过了一些东西
检查本书的勘误表页面(如果存在)。从我的描述中可以看出,它至少包含一个拼写错误(operator=
vs operator==
)。
答案 1 :(得分:1)
当prototype中的返回类型为void时,HardLogic :: compare返回bool SoftLogic :: compare在原型中返回void并且不返回任何内容,这是完全正常的