C ++函数重载

时间:2012-02-13 02:44:27

标签: c++ templates operator-overloading overloading

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

感谢您的帮助。

2 个答案:

答案 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;
}