Перегрузка функции C ++ - PullRequest
       12

Перегрузка функции C ++

1 голос
/ 13 февраля 2012

Я знаю, что в 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 ]

4 голосов
/ 13 февраля 2012

Вызов неоднозначен, потому что код требует преобразования (индекс int, а ваш operator[] ожидает значение типа unsigned), и, как говорится в сообщении об ошибке, существует несколько возможных преобразований. (Это было бы не так, если бы вы не указали оператор преобразования operator T*.)

ошибка C2666: 'Array :: operator []': 4 перегрузки имеют похожие преобразования может быть

  • 'int & Array :: operator [] (без знака int)'
  • 'const int & Array :: operator [] (без знака 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;
1 голос
/ 13 февраля 2012

Нет, он должен звонить T& operator[](int n).

Это работает:

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