我正在尝试制作一个程序来演示我的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);
}
}
问题是,当我尝试使用我的重载下标运算符时,我得到标题中显示的错误消息:“没有这样的运算符”[]“匹配这些操作数”我不完全确定原因。它为我的整数数组和我的字符串数组都做了。任何帮助表示赞赏。
答案 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>
行会重新引入参数,以便返回到类模板中。