【发布时间】:2015-05-30 14:47:15
【问题描述】:
我知道数组索引在 C 和 C++ 中都是可交换的,所以 a[i] 与 i[a] 相同,它的效果与 i[a] 相同,并且两者都是有效的。但是最近我写了一个下面的程序,当我使用 i[intob] 而不是 tob[i] 时编译失败。
#include <iostream>
#include <cstdlib>
using std::cout;
template<class T>class atype
{
T* a;
int size;
public:
atype(int n)
{
size=n;
a=new T[size];
for(auto i=0;i<size;i++)
a[i]=i;
}
~atype()
{
delete[] a;
}
T& operator[](int i);
};
template<class T> T& atype<T>::operator[](int i)
{
if(i<0 || i>size)
{
cout<<"\nIndex value of ";
cout<<i<<" is out of bounds.\n";
exit(1);
}
return a[i]; // i[a] also works fine here.
}
int main()
{
int i,n;
cout<<"Enter value of n: ";
std::cin>>n;
atype<int> intob{n};
atype<long int> longintob{n};
cout<<"Integer array: ";
for(i=0;i<n;i++)
intob[i]=i;
for(i=0;i<n;i++)
cout<<i[intob]<<' '; // oops compiler error why???
cout<<'\n';
cout<<"long integer array: ";
for(i=0;i<n;i++)
longintob[i]=i;
for(i=0;i<n;i++)
cout<<longintob[i]<<' ';
longintob[15]=123;
}
我收到以下编译器错误。
[错误] 'operator[]' 不匹配(操作数类型为 'int' 和 'atype')
但是,如果我在重载的 [] 运算符函数中编写 i[a],那么它可以正常工作。为什么?
是否存在使用 i[intob] 访问数组元素的解决方案?
如果我在某处错了或理解有误,请告诉我。
【问题讨论】:
-
atype违反了三原则。 -
你有一个析构函数,但没有复制构造函数和复制赋值运算符。
-
如果你写
atype<int> a(1), b(1); a = b;你有内存泄漏和双重释放。 -
@fredoverflow:但我没有执行任何任务或复制。那为什么我需要写赋值运算符和复制构造函数呢?如果我真的不需要作业或副本怎么办。
-
然后你应该将复制构造函数和赋值运算符声明为私有,并让它们未实现。或者
= delete他们,如果你有 C++11 编译器。
标签: c++ arrays templates compiler-errors