我正在编写一个小模板类,它可以作为模板参数列表或向量(显然还有数据类型)。我需要重载 [ ] 运算符,为此我想使用向量的重载 [ ] 并对列表进行简单的搜索(下一个,下一个,直到我们到达所需的索引)。所以我用 typeid 检查参数是否是列表的参数并根据这样的结果实现:
const T* operator[](size_t _index)const
{
if(typeid(ContainerT<T,std::allocator<T> >) == typeid(vector<T>))
{
return m_container[_index];
}
else
{
const_iterator it = m_container.begin();
for(int i=0;i<_index;++i)
{
++it;
}
return *it;
}
}
如果我不使用 [ ] 作为列表,一切都很好,但是当我使用它时:
tContainer_t<int, list> list1;
cout<<list1[0]<<endl;
它根本没有编译,这是编译错误:
In file included from main.cpp:6:0:
tContainer.h: In member function ‘const T* tContainer_t<T, ContainerT>::operator[](size_t) const [with T = int, ContainerT = std::list, size_t = unsigned int]’:
main.cpp:68:9: instantiated from here
tContainer.h:80:29: error: no match for ‘operator[]’ in ‘((const tContainer_t<int, std::list>*)this)->tContainer_t<int, std::list>::m_container[_index]’
我不明白,因为我检查了 typeid 确实有效(我认为......),无论如何编译器似乎看到下标也将被调用列表。