我遇到了在类模板中重载下标运算符的问题。我有以下头文件来声明类模板(我只包含相关函数):
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;属性。
知道为什么会出现这个问题吗?
答案 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];