2011-05-05 73 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,不返回任何東西,這是完全正常