[英]C++ error: operator[] cannot be overloaded
我正在學習C ++,並研究Vandevoorde和Josuttis的C ++模板的第18章。 我為表達式模板重新輸入了他們的代碼,但是以下內容產生了錯誤
sarray1.cpp:36:6: error: ‘T& SArray<T>::operator[](size_t) const’ cannot be overloaded
T& operator[] (size_t idx) const {
^
sarray1.cpp:32:5: error: with ‘T SArray<T>::operator[](size_t) const’
T operator[] (size_t idx) const {
這是代碼:
template <typename T>
class SArray {
public:
...
T operator[] (size_t idx) const {
return storage[idx];
}
T& operator[] (size_t idx) const {
return storage[idx];
}
...
};
我只是在學習C ++,所以沒有看到僅在返回類型上有所不同的重載函數實例,但是我確實做到了: 根據返回值重載C ++函數 。 我還看到[]
不在C ++中不能重載的運算符列表中 。 我想不到還有什么地方出了問題。 出現上述錯誤的原因是什么?
重新鍵入323頁上的代碼時,您犯了一個錯誤。只有第一個重載應該是const
,而第二個重載應該是非const
:
T operator[] (size_t idx) const {
return storage[idx];
}
T& operator[] (size_t idx) { // <<== No const here
return storage[idx];
}
該代碼試圖說明的點是,您可以使操作符重載this
對象的const
。 C ++將從上下文中找出應調用的兩個運算符中的哪個,然后在SArray
為非常量時返回引用,或者在數組為const
時返回副本。
嚴格來說,您不能在返回類型上重載。 如果您閱讀所鏈接的問題和答案( 根據返回值重載C ++函數 ),則會看到需要解決方法。
但是,您真的必須問您在做什么嗎? 有沒有更簡單的解決方案?
您可能應該有一個const
方法和一個非const
方法:
const T& operator[] (size_t idx) const {
return storage[idx];
}
T& operator[] (size_t idx) {
return storage[idx];
}
您不能在C ++中按返回類型重載。 考慮的是參數,對於成員函數,則是資格。 在這種情況下,我猜測您的意思是:
// a non-const member function to return a non-const reference
T& operator[] (size_t idx) {
return storage[idx];
}
// a const member function to return a const reference
const T& operator[] (size_t idx) const {
return storage[idx];
}
這樣,如果this
是指向const
的指針,則將調用const
成員函數(因為非const
函數不可行),否則將調用非const
函數(因為它將是更好的匹配)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.