簡體   English   中英

C ++錯誤:operator []無法重載

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM