2012-12-03 48 views
5

一般來說,你如何聲明一個類的索引[ ]操作符用於讀寫訪問?C++:爲讀寫訪問重載[]運算符

我想是這樣

/** 
* Read index operator. 
*/ 
T& operator[](T u); 

/** 
* Write index operator 
*/ 
const T& operator[](T u); 

它給我的錯誤

../src/Class.h:44:14: error: 'const T& Class::operator[](T)' cannot be overloaded 
../src/Class.h:39:8: error: with 'T& Class::operator[](T)' 

回答

14

你的可變版本是好的:

T& operator[](T u); 

const版本應該是一個const成員函數以及返回const參考:

const T& operator[](T u) const; 
         ^^^^^ 

這不僅從另一個區別開來過載,但也允許(只讀)訪問您班級的const實例。一般來說,重載成員函數可以通過它們的參數類型和const/volatile限定符來區分,但是而不是的返回類型。

6

您只需一個重載會被用於讀取和寫入:

T& operator[](int); 

話雖如此,你可能也想要一個const過載:

const T& operator[](int) const; 

這將爲您的課程的const實例提供只讀索引。

+0

只是爲了進一步說明,這是因爲運算符重載返回對該對象的引用。這使您可以分配並讀取它,因此只需要一次過載。 – Chris

2

您會收到錯誤信息,因爲重載函數只能通過返回類型不能區分。但是它們可以因不變而不同。

/** 
* Write index operator. 
*/ 
T& operator[](T u); 

/** 
* Read index operator 
*/ 
const T& operator[](T u) const; 

注意「寫入」和「讀取」交換位置。

此外,難道你不是指運算符的參數是一些整數類型嗎?