使用类模板在下标重载函数中初始化引用类型无效

时间:2014-09-01 16:41:32

标签: c++ class templates arraylist operator-overloading

我遇到了在类模板中重载下标运算符的问题。我有以下头文件来声明类模板(我只包含相关函数):

arrayListType.h

template <class elemType>
class arrayListType {
public:
    arrayListType<elemType>& operator[](int);
    arrayListType(int size = 100);
    virtual ~arrayListType();
protected:
    elemType *list;    // array to hold the list elements
    int length;        // variable to store the length of the list
    int maxSize;       // variable to store the maximum size of the list
};

template <class elemType>
arrayListType<elemType>& arrayListType<elemType>::operator[](int index) {
    assert(0 <= index && index < length);
    return list[index];
}

我在main.cpp中有以下代码,其中felinoTipo是一个具有自己属性的不同派生类,并且工作正常。另外,我没有在上一个头文件中显示函数 insertEnd ,但它也可以正常工作。

的main.cpp

#include "arrayListType.h"

int main() {
    arrayListType<felinoTipo> listaFelinos(20);

    felinoTipo felinoTemp1("Tigre", "Tigrillo", 1.1, 1.1);

    listaFelinos.insertEnd(felinoTemp1);

    listaFelinos[0]; //Line X

    return 0;
}

问题出现在标记为X的行中。当我评论该行并构建项目时,未发现任何错误。但是,当我包含那行代码时,我得到错误类型&#39; arrayListType&amp;&#39;从表达类型&felinoTipo&#39; main.cpp中即可。我的主要目的是将操作符重载函数获取的引用存储在felinoTipo基类的指针数组中,以使用虚函数打印出对象&#39;属性。

知道为什么会出现这个问题吗?

1 个答案:

答案 0 :(得分:1)

您的运营商返回此类型:

arrayListType<elemType>& 

但你要返回

elemType& 

编译器抱怨从一个转换为另一个无效。

你需要这些内容:

template <class elemType>
class arrayListType {
public:
    typedef elemType element_type;
    element_type& operator[](int);
    const element_type& operator[](int) const; // good idea to provide const overload
....
};

然后

auto& e = listaFelinos[0];

或者,如果你没有C ++ 11,

arrayListType<felinoTipo>::element_type& e = listaFelinos[0];