2011-10-12 88 views
3

只是一個簡單的問題,如果我有一個模板類:C++類的繼承和運算符重載;操作符重載是否被繼承?

template <typename T> 
class foo { 
public: 
    bool operator!=(foo& other) const { 
     //... 
    } 

} 

然後我繼承着稱類:

template <typename T> 
class bar : public foo<T> { 
    //... 
} 

是否運算符重載得到繼承?如果不是,我將如何去實現它,這樣它...因爲目前在我的測試類,這帶來了一個錯誤:

for (bar<int> i(baz); i != bar<int>(); i++) {} 

++運算符是在酒吧類中實現的,所以那是有效的,但是!=運算符顯然沒有被繼承。該錯誤信息是:

error: no match for 'operator!=' in 'i != bar<int>(0u, 0u)' 
note: candidate is: bool foo<T>::operator!=(foo<T>&) const [with T = int] 

這幾乎概括了我有這個問題,所以我只是想知道我怎麼會去繼承運算符重載。

+0

不是您的問題的完整答案,但此類操作符應該作爲非成員函數實現。這將(解決你的問題(並在其他幾種方式表現更好) – jalf

+3

@jalf:[它再次發生](http://xkcd.com/859/) –

+0

但至少它發生在一個新的通常你會忘記關閉括號,這次我添加了一個'(',它絕對沒有任何意義!) – jalf

回答

6

你的運營商定義是不太正確的:

bool operator!=(foo& other) const { 
    //... 
} 

應該

bool operator!=(const foo& other) const { 
    //... 
} 

,因爲你試圖用一個臨時的,它只能被綁定到一個const參考比較。

+0

謝謝,這個清除了它!編寫了太多的Java並且沒有足夠的C++,所以我似乎常常忘記const引用/聲明... – Fault