2011-05-05 49 views
2

我想从C++第2卷思维进行以下锻炼,巫婆说:模板练习题

在下面的代码的类不可比不具有运算符=()。为什么类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 ::比较返回void但函数试图O返回一个INT /布尔。
2)SoftLogic也有一些奇怪的东西(对我来说):nc1 == nc2。
3)练习说关于operator =(),但在代码中使用operator ==()。

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

回答

5

因为编译器不需要诊断永远不能实例化为有效专业化的模板。只有在实际实例化它们时才需要对它们进行诊断。他们是否早些诊断它们只是实施的质量。

这也适用于类模板的成员函数。如果您想尝试拨打l.compare(),编译器将需要实例成员函数,并且需要来诊断错误。

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

HardLogic ::比较返回void但函数试图O返回一个INT /布尔

由于有关operator==没有定义,你不知道它会回来。它可以返回void,在这种情况下return nc1 == nc2;就可以了。

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

查看本书的勘误表,如果它们存在的话。从我可以从你的描述看,它至少包含一个错字(operator= VS operator==)。

+0

我有gcc编译器,我总是得到一个错误,即使我评论HardLogic类 – Kobe 2011-05-05 16:59:27

1

HardLogic ::比较返回一个布尔值时,在原型的返回类型为void 软逻辑::原型比较返回void,不返回任何东西,这是完全正常