C ++订阅运算符重载

时间:2013-07-24 19:44:44

标签: c++ operator-overloading subscription

我正在努力在一些项目停机期间刷新我的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 :(得分:0)

您无法致电您的运营商,因为它预计会LinkedList<int>,但您提供LinkedList<int>*。 你可以取消引用:

 T foo = (*list)[5];

或者,您可以将运算符定义为适用于指针类型。

答案 1 :(得分:-1)

您的节点类是如何定义的?你返回temp-&gt; Value; 但是您的功能签名表示您将返回对您的班级(T&amp;)的引用。如果是node.Value 是一个int,这可能是你的问题。

答案 2 :(得分:-2)

  

在我的主要功能中,我有以下几行:

     

int foo = list [5];

     

一切对我来说都很好,但是当我编译时,我得到以下错误:

     

错误C2440:'初始化':无法从'LinkedList'转换为'int'

     

有没有人有任何想法如何解决这个问题?

编译器错误消息说明了一切。您使用LinkedList<T>这是一种通用类型,类型由T表示。因此,您无法在编译时将T类型的元素分配给int。由于编译器只会在运行时知道LinkedList的类型,因此您只能将其分配给T

类型的对象

如何解决问题:通过以下行替换行int foo = list[5];

T foo = list[5];