模板练习问题

Templates exercise problem

本文关键字:问题 练习      更新时间:2023-10-16

我试着做下面的练习,从思考在c++卷2,女巫说:

在下面的代码中,类NonComparable没有操作符=()。为什么类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 ==()。

这些是错误吗?我觉得很奇怪,像这样一本书里的代码竟然有这么多错误,我是不是错过了什么?有人以前遇到过这个练习吗?

因为编译器不需要诊断永远无法实例化为有效专门化的模板。只有在实例化时才需要对它们进行诊断。他们是否能更早地诊断出这些问题只是执行的质量问题。

对于类模板的成员函数也是如此。如果您尝试调用l.compare(),编译器将需要实例化成员函数,并且需要诊断错误。

一个好的编译器在这两种情况下都会给出错误。

HardLogic::compare返回void,但函数尝试返回int/bool

由于所讨论的operator==没有定义,因此您不知道它将返回什么。它可以返回void,在这种情况下,return nc1 == nc2;就可以了。

这些是错误吗?我发现像这样一本书的代码中有这么多错误是很奇怪的,所以我错过了什么

检查书中的勘误表页,如果存在的话。从你的描述中我可以看到,它至少包含一个错别字(operator= vs operator==)。

HardLogic::compare在prototype返回类型为空时返回bool值SoftLogic::compare在原型中返回void,不返回任何东西,这是完全OK的