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);
    }
}

问题是,当我尝试使用重载的下标运算符时,我收到标题中显示的错误消息:“没有这样的运算符“[]”与这些操作数匹配”我不确定为什么。它适用于我的整数数组和我的字符串数组。任何帮助表示赞赏。

4

2 回答 2

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;

这显然违背了你的意图。

于 2013-02-26T02:57:19.957 回答
1
template<class T>
T& operator [](const int index) 

该声明将被称为例如 as object.operator[] < type >( 5 )。请注意,type需要作为模板参数提供。因为无法在 using 表达式中提供这样的参数[],所以运算符重载不起作用。

可能你根本不想要template< class T >。摆脱它:

T& operator [](const int index) 

如果你在class {}范围之外定义函数,那么它看起来像这样:

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

在这种情况下,该template<class T>行重新引入参数以返回到类模板中。

于 2013-02-26T04:43:27.743 回答