C++函数过载

C++ function overload

本文关键字:函数 C++      更新时间:2023-10-16

我知道在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作为我的编译器

谢谢你的帮助。

调用不明确,因为代码需要转换(索引为intoperator[]需要类型为unsigned的值),而且正如错误消息所说,有多种可能的转换。(如果您没有提供operator T*转换运算符,情况就不会如此。)

错误C2666:"Array::operator[]":4个重载具有类似的转换可能是

  • 'int&数组::operator[](unsigned int)'
  • 'const int&数组::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;
}

顺便说一句,提供对指针类型的直接转换通常被认为是一个坏主意(TM),因为它启用了以下语法:

Array<int> array(20);
delete array;

否,它应该调用T& operator[](int n)

这项工作:

for(unsigned int i = 0; i != 20; ++i)
{
    IntArray[i] = i;
}