模板运动问题

时间:2011-05-05 16:51:31

标签: c++

我正在尝试使用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 ==()。

是错误吗?我发现在这样一本书的代码中出现如此多的错误很奇怪,所以我错过了什么?以前有没有人遇到这个练习?

2 个答案:

答案 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并且不返回任何内容,这是完全正常的