我知道在C ++函数中可以通过const属性重载,但是当我运行这段代码时出错了:
#include <iostream>
#include <conio.h>
using namespace std;
template<class T> class Array
{
public:
Array() : data(0), sz(0){}
Array(unsigned size) : sz(size), data(new T[size]){}
~Array()
{
delete[] data;
}
const T& operator[](unsigned n) const
{
if(n >= sz || data == 0)
{
throw "Array subscript out of range";
}
return data[n];
}
T& operator[](unsigned n)
{
if(n >= sz || data == 0)
{
throw "Array subscript out of range";
}
return data[n];
}
operator const T*() const
{
return data;
}
operator T*()
{
return data;
}
private:
T* data;
unsigned sz;
Array(const Array& a);
Array& operator=(const Array&);
};
int main()
{
Array<int> IntArray(20);
for(int i = 0; i != 20; ++i)
{
IntArray[i] = i;
}
return 0;
}
错误来自IntArray[i] = i;
编译器说它无法找到正确的重载函数。
不应该叫T& operator[](unsigned n)
??
我正在使用vs2010作为我的编译器
感谢您的帮助。
答案 0 :(得分:4)
调用不明确,因为代码需要转换(索引为int
且您的operator[]
需要类型unsigned
的值),并且如错误消息所示,有多个可能的转换。 (如果您未提供operator T*
转换运算符,则情况并非如此。)
错误C2666:'Array :: operator []':4次重载具有类似的转换 可能是
- 'int&amp; Array :: operator [](unsigned int)'
- 'const int&amp; Array :: operator [](unsigned int)const'
- '内置C ++运算符[(const int *,int)'
- '内置C ++运算符[(int *,int)'
尝试将参数列表'(Array,int)'与[T = int]
匹配
只需更改for循环即可使用unsigned
类型的索引,以便它可以选择正确的重载。
for(unsigned i = 0; i != 20; ++i)
{
IntArray[i] = i;
}
顺便提一下,提供直接转换为指针类型通常被认为是Bad Idea(TM),因为它启用了这种语法:
Array<int> array(20);
delete array;
答案 1 :(得分:1)
不,应该拨打T& operator[](int n)
。
这有效:
for(unsigned int i = 0; i != 20; ++i)
{
IntArray[i] = i;
}