【问题标题】:C++ function overloadC++ 函数重载
【发布时间】:2012-02-13 02:44:26
【问题描述】:

我知道在 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&amp; operator[](unsigned n)吗??

我使用 vs2010 作为编译器

感谢您的帮助。

【问题讨论】:

标签: c++ templates operator-overloading overloading


【解决方案1】:

调用不明确,因为代码需要转换(索引为int,而您的operator[] 需要unsigned 类型的值)并且如错误消息所述,存在多种可能的转换。 (如果您没有提供operator T* 转换运算符,则不会出现这种情况。)

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

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

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

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

【讨论】:

  • 或者,为T&amp; operator[](int n)const 变体添加重载,这样int 索引就不需要转换。它的代码有点多,但可能会减少使用该类的令人沮丧的体验。
  • @MichaelBurr:确实,但简单地删除“转换为指针”运算符可能是一个更好的选择。 std::vector&lt;&gt; 不提供operator[](int) 也不会产生此类问题。
【解决方案2】:

不,它应该调用T&amp; operator[](int n)

这行得通:

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

【讨论】:

    猜你喜欢
    • 2014-06-18
    • 2012-09-02
    • 2014-05-30
    • 2011-01-10
    • 2011-02-10
    • 2010-09-18
    • 2011-07-30
    • 1970-01-01
    相关资源
    最近更新 更多