没有这样的运算符“[]”匹配这些操作数

时间:2013-02-26 02:52:10

标签: c++ templates operator-overloading

我正在尝试制作一个程序来演示我的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 个答案:

答案 0 :(得分: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;

这显然违背了你的意图。

答案 1 :(得分: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>行会重新引入参数,以便返回到类模板中。