Ошибка: выражение не может быть использовано как функция - оператор () - PullRequest
0 голосов
/ 05 октября 2018

Я создаю класс-оболочку для одного указателя, который действует как двумерный массив.У меня есть перегруженный оператор () для возврата значения из массива.
Я хочу иметь возможность использовать оператор () для доступа к значениям массива в форме arr (r, c)

#include <iostream>
#include <cstring>

using namespace std;

template <class T>
class TwoDArray
{
    private:
        T * arr;
        int rows, columns, size;
        int getIndex(int r, int c)
        {
            int index = (r*columns) + c;
            return index;
        }
    public:
        /*Constructor*/
        TwoDArray(int r = 1, int c = 1) : rows(r), columns(c)
        {
            if(r > 0 && c > 0)
            {
                size = rows*columns;
                arr = new T [size];
                memset(arr, 0, sizeof(int)*size);
            }

            else
            {
                arr = NULL;
            }
        }

        void setAtIndex(int r, int c, T value)
        {
            int index = getIndex(r, c);
            arr[index] = value;
        }

        //lvalue - has the effect obj(r,c);
        T& operator()(unsigned int r, unsigned int c)
        {
            if(r >= rows || c >= columns)
            {
                cerr<<"Unable to locate memory\n";
                exit(0);
            }
            return arr[getIndex(r,c)];
        }

        //rvalue - has the effect obj(r,c);
        const T& operator()(unsigned int r, unsigned int c) const
        {
            if(r >= rows || c >= columns)
            {
                cerr<<"Unable to locate memory\n";
                exit(0);
            }
            return arr[getIndex(r,c)];
        }

        void displayTwoD() const
        {
            for (int i = 0; i < rows; ++i)
            {
                for (int j = 0; j < columns; ++j)
                {
                    cout<<this->arr(i,j);
                }
                cout<<"\n";
            }
        }

        /*Destructor*/
        ~TwoDArray()
        {
            if(arr != NULL)
                delete arr;
            arr = NULL;
        }
};

int main()
{
    TwoDArray <int> tda(5,5);

    for (int i = 0; i < 5; ++i)
    {
        for (int j = 0; j < 5; ++j)
        {
            tda.setAtIndex(i,j, (i+1)*2);
        }
    }

    tda.displayTwoD();
    return 0;
}

Я получаю ошибку:

G:\DS>g++ checkError.cpp
checkError.cpp: In instantiation of 'void TwoDArray<T>::displayTwoD() const [with T = int]':
checkError.cpp:95:18:   required from here
checkError.cpp:68:10: error: expression cannot be used as a function
      cout<<this->arr(i,j);

, когда я использую

cout<<arr(i,j);

в любом месте кода.Я хочу знать, почему это происходит и как это решить.

1 Ответ

0 голосов
/ 05 октября 2018

РЕДАКТИРОВАТЬ: Теперь я вижу, что вы хотите сделать.Вы хотите вызвать оператор () из функции-члена.Вы можете сделать это, отменив ссылку на «this»:

(*this)(i,j)

Старый ответ, но не имеет смысла:

TwoDArray :: arr - указатель, вам нужно отменить ссылку на него: (* обр) (i, j)

...