模板运动问题

Adr*_*ian 2 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;
}
Run Code Online (Sandbox Code Playgroud)

1)HardLogic :: compare返回void但函数尝试返回int/bool.
2)SoftLogic也有一些奇怪的东西(对我来说):nc1 == nc2.
3)练习说的是operator =(),但在代码中它使用的是operator ==().

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

Joh*_*itb 5

因为编译器不需要诊断永远无法实例化为有效特化的模板.它们仅在实际实例化时才需要诊断它们.他们是否更早地诊断它们只是一种实施的质量.

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

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

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

由于operator==未定义问题,您不知道它会返回什么.它可以返回void,在这种情况下return nc1 == nc2;会没事的.

是错误吗?我发现在这样一本书的代码中出现如此多的错误很奇怪,所以我错过了一些东西

查看本书的勘误表页面(如果存在).从我的描述中可以看出,它包含至少一个拼写错误(operator=vs operator==).