2013-07-24 3 views
0

Я работаю над очисткой моего C++ во время простоя проекта и создал для этого проект Linked List. В этом проекте я хотел бы вернуть текущее значение по заданному индексу. У меня уже есть способ сделать это, но вы хотите работать с перегрузкой оператора.Перегрузка оператора подписки на C++

С этой целью я сделал необходимые исследования, чтобы освежить и создал следующий код (я не буду подвергать всех на мой код и вставить только соответствующие разделы):

T& operator[](const int index); 

template<class T> 
T& LinkedList<T>::operator[](const int index) 
{ 
    try 
    { 
    if(!isIndexValid(index)) throw ior; 

    Node<T> *temp = _head; 
    for(int i=1; i<=index; i++) 
    { 
     temp = temp->Next; 
    } 

    return temp->Value; 
    } 
    catch(exception& e) 
    { 
    cout << e.what() << endl; 
    } 
} 

В моем основных функция у меня есть следующие строки:

int foo = list[5]; 

Все выглядит хорошо для меня, но когда я компилирую, я получаю следующее сообщение об ошибке:

error C2440: 'initializing' : cannot convert from 'LinkedList<T>' to 'int' 

Есть ли у кого-нибудь идеи, как это исправить?

Спасибо!

Для тех, кто спросил, вот как определяется класс Node:

template<class T> 
class Node 
{ 
    public: 
    Node(); 
    Node(const T value); 

    T Value; 
    Node<T> *Prev; 
    Node<T> *Next; 
}; 

А вот заявление для моего списка переменной:

LinkedList<int> *list = new LinkedList<int>(); 
+3

В какую строку относится ошибка? Кроме того, как объявляется «список»? –

+0

Я бы предпочел, чтобы параметр 'operator []' имел тип 'size_t', а не' int'. –

+0

Каково определение переменной 'list'? Где вы называете строку 'int foo = list [5];'? И почему ваша функция ничего не возвращает, если исключение было поймано? Кроме того, 'count' ваш псевдоним для' cout'? :) – podkova

ответ

-2

In my main function I have the following line:

int foo = list[5];

Everything looks good to me, but when I compile I get the following error:

error C2440: 'initializing' : cannot convert from 'LinkedList' to 'int'

Does anyone have any ideas how to fix this?

сообщение об ошибке компилятора говорит все это. Вы используете LinkedList<T>, который является общим типом, и тип представлен T. Таким образом, вы не можете назначить элемент типа T во время компиляции int. Поскольку компилятор только знать, какой тип LinkedList во время выполнения, вы можете только назначить его на объект типа T

Как это исправить: заменить строку int foo = list[5]; на следующую строку.

T foo = list[5];

+0

Пожалуйста, сделайте одолжение миру и купите хорошую книгу на C++.Ваш ответ означает, что вы ничего не понимаете в шаблонах C++. ** EDIT: ** Я не читал вашу последнюю строку, я только сосредоточил свой комментарий на * «... компилятор знает, какой тип связанного списка во время выполнения» *. Но ваша последняя строка ... У меня недостаточно слов ... – Manu343726

+0

Я действительно не понимаю, почему другие глупые ответы в других темах, которые я прочитал в SO, получили много downvotes, и у этого не было 100k downvotes. – Manu343726

-1

Как ваш класс узла определяется? Вы возвращаете temp-> Value; Но ваша подпись функции говорит, что вы вернете ссылку на свой класс (T &). Если node.Value - это int, это может быть вашей проблемой.

+0

-1 Вопросы, требующие разъяснений, должны быть опубликованы как комментарий, а не ответ. –

+0

У меня недостаточно репутации для публикации в качестве комментария. Решение будет работать, если мое подозрение будет правильным. – veksev

+2

Я понимаю, что у вас недостаточно комментариев, чтобы прокомментировать, но исправить это, чтобы увеличить репутацию, задав хороший вопрос и давая хорошие ответы, а не обойти предел репутации, отправив комментарий в качестве ответа. Это может показаться болью, но 50 повторений легко найти. –

0

Вы не звоните вашему оператору, так как он ожидает LinkedList<int>, но вы предоставляете LinkedList<int>*. Вы могли разыменовать:

T foo = (*list)[5]; 

Или вы определяете оператор быть appliable к типу указателя.