Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ [] operator overload problem

I'm still new to C++ so I daily run into new problems.

Today came the [] operator's turn:

I'm making myself a new generic List class because I don't really like the std's one. I'm trying to give it the warm and fuzzy look of the C#'s Collections.Generic List, so I do want to be able to access elements by index. To cut to the chase:

Extract from the template:

T& operator[](int offset)
    {
        int translateVal = offset - cursorPos;

        MoveCursor(translateVal);

        return cursor->value;
    }

    const T& operator[](int offset) const
    {
        int translateVal = offset - cursorPos;

        MoveCursor(translateVal);

        return cursor->value;
    }

That's the code for the operators. The template uses "template", so as far as I saw on some tutorials, that's the correct way to do operator overloading.

Nevertheless, when I'm trying to access by index, e.g.:

Collections::List<int> *myList;
myList = new Collections::List<int>();
myList->SetCapacity(11);
myList->Add(4);
myList->Add(10);
int a = myList[0];

I get the

    no suitable conversion function from "Collections::List<int>" to "int" exists

error, referring to the "int a = myList[0]" line. Basically "myList[0]" type's is still "Collections::List", although it should have been just int. How Come?

like image 906
cantrem Avatar asked Dec 05 '22 23:12

cantrem


1 Answers

Since myList is a pointer myList[0] doesn't invoke operator[], it returns Collections::List<int>*. What you want is (*myList)[0]. Or better still, Collections::List<int>& myRef = *myList; and then use myRef[0] (Other option is not allocate the memory for myList on the heap, you can create it on stack using Collections::List<int> myList and then use . operator on it).

like image 90
Asha Avatar answered Dec 09 '22 13:12

Asha