2013-02-26 196 views
0

我正在試圖製作一個程序,演示如何使用CS類的模板和重載運算符。下面是相關的代碼:沒有這樣的運算符「[]」匹配這些操作數

主:

ArrayTemplate<int> number(0); 
      number[0] = 1; 
      number[1] = 2; 
      number[2] = 3; 

    ArrayTemplate<string> word("na"); 
      word[0] = "One"; 
      word[1] = "Two"; 
      word[2] = "Three"; 

頭:

template<class T> 
T& operator [](const int index) 
{ 
    if(index >= 0 && index < ARRAY_MAX_SIZE) 
     return items[index]; 
    else 
    { 
     cerr << "INDEX OUT OF BOUNDS!!!"; 
     exit(1); 
    } 
} 

的問題是,當我嘗試使用我的重載下標運算符,我得到的標題所示的錯誤消息:「沒有這樣的操作符「[]」匹配這些操作數「我不完全確定爲什麼。它對我的整型數組和我的字符串數組都是這樣。任何幫助表示讚賞。

+2

'items'的類型是什麼? – chris 2013-02-26 02:53:45

回答

6

真的需要顯示ArrayTemplate的完整定義。

這是怎麼了,你可能希望它看起來:

template<class T> 
class ArrayTemplate { 
    public: 

    // ... 

    T& operator [](const int index) 
    { 
     if(index >= 0 && index < ARRAY_MAX_SIZE) 
      return items[index]; 
     else 
     { 
      cerr << "INDEX OUT OF BOUNDS!!!"; 
      exit(1); 
     } 
    } 

    // ... 
}; 

注意operator[]不是模板;只有班級是。

根據您目前的代碼,你會做這樣的:

number<int>[0] = 1; 
number<int>[1] = 2; 
number<int>[2] = 3; 

這顯然違背了你的意圖。

+0

比你的解釋。我沒有意識到我不需要模板操作員。刪除該行固定該程序,並按預期工作。 – user2069621 2013-02-26 19:29:36

1
template<class T> 
T& operator [](const int index) 

該聲明將被稱爲例如,作爲object.operator[] <type>(5)。請注意,type需要作爲模板參數提供。因爲在使用[]的表達式中無法提供這樣的參數,所以運算符重載不起作用。可能你根本不需要template< class T >。剛剛擺脫它:

T& operator [](const int index) 

如果定義class {}範圍之外的功能,那麼它應該是這樣的:

template<class T> 
T& ArrayTemplate<T>::operator [](const int index) 

在這種情況下,template<class T>線重新引入了參數爲了回到類模板。

相關問題