2010-10-07 72 views
0

超載[]的問題,這是我的泛型類:在2個變化

template<class T, class PrnT> 
class PersonalVec { 

public: 
    PersonalVec(); 
    T &operator[](int index) const; 
    const T &operator[](int index) const; 

private: 
    std::vector<T> _vec; 

}; 

我需要實施2個版本的[]操作:
一個會返回一個const引用和經常一個這也將返回一個參考。 當我編譯它,我得到:
PersonalVec.hpp:23: error: ‘const T& PersonalVec<T, PrnT>::operator[](int) const’ cannot be overloaded
PersonalVec.hpp:22: error: with ‘T& PersonalVec<T, PrnT>::operator[](int) const

我已經把其中一方的言論,然後它編譯,所以我想他們已經在某種程度上發生碰撞。什麼是問題,我該如何解決它?

謝謝!

回答

-1

函數的返回類型不是可用於重載函數的條件。 函數可以被重載,如果:
1的不同參數沒有
2的參數不同的充序列或
3.不同類型的參數

您正在嘗試基於返回類型,因此過載功能它給出了錯誤。
'const'關鍵字可以幫助您重載函數,即使上述3個標準不符合。所以簡單的解決方案可以是使其中的一個函數爲const並將其他函數作爲正常函數來使用

3

您需要:

T &operator[](int index); 
const T &operator[](int index) const; 

即非const運算符返回非const引用和const一個返回常量引用。

2

您不能基於返回類型進行重載,您只能根據參數類型進行重載,包括成員函數的隱藏this參數。

該類型的函數調用表達式,或涉及潛在的過載操作者的表達,是通過重載解析所選擇的功能類型來確定,就不能迫使這樣的表達具有特定的類型,並嘗試影響重載解析從返回類型。

您需要根據參數類型或thisconst的內容給出您的重載函數簽名,或者您需要選擇一種適當的返回類型並具有單個函數。

0

返回非const引用時,需要刪除函數的常量。

T &operator[](int index);
const T &operator[](int index) const;

超載不和不能返回類型發生。