我认为我的问题与模板有关但我不知道。我正在犯错误:
error: conversion from '__gnu_cxx::__normal_iterator<FxStreamable* (***)(), std::vector<FxStreamable* (**)(), std::allocator<FxStreamable* (**)()> > >' to non-scalar type '__gnu_cxx::__normal_iterator<std::pair<FxClassID, FxStreamable* (*)()>*, std::vector<std::pair<FxClassID, FxStreamable* (*)()>, std::allocator<std::pair<FxClassID, FxStreamable* (*)()> > > >' requested
和
no match for 'operator!=' in 'itera1 != ((FxPairRegistry<FxClassID, FxStreamable* (*)()>*)this)->FxPairRegistry<FxClassID, FxStreamable* (*)()>::mRegistryList. std::vector<_Tp, _Alloc>::end [with _Tp = FxStreamable* (**)(), _Alloc = std::allocator<FxStreamable* (**)()>]()'
for (iter itera1 = mRegistryList.begin(); itera1 != mRegistryList.end(); itera1++)
{
if ((*itera1).first == id)
{
return (*itera1).second;
}
}
任何人都可以了解出了什么问题吗?
更新:mRegistryList定义为vector<registeredObject *> mRegistryList;
更新:itera定义typedef typename std::vector<pair<identifier,registeredObject> >::iterator iter;
更新3:
template <class identifier,class registeredObject> registeredObject FxPairRegistry<identifier,registeredObject>::GetEntry(identifier id, FxBool assertValue)
{
for (std::vector<registeredObject *>::iterator itera1 = mRegistryList.begin(); itera1 != mRegistryList.end(); itera1++)
{
if ((*itera1).first == id)
{
return (*itera1).second;
}
}
if (assertValue)
ASSERT_MSG(0,"Entry not found in the registry");
return NULL;
}
答案 0 :(得分:5)
您的迭代器类型与mRegistryList
vector
的迭代器类型不匹配。
迭代器:std::vector<std::pair<FxClassID, FxStreamable* (*)()> >::iterator
容器:std::vector<FxStreamable* (**)()>
编辑:回应更新:
使用vector<registeredObject *>::iterator
- 而不是其他无关的迭代器。
要迭代vector<X>
容器,您需要vector<X>::iterator
而不是vector<SomethingElse>::iterator
编辑:回应新的更新:
for (typename std::vector<registeredObject *>::iterator itera1 = mRegistryList.begin(); itera1 != mRegistryList.end(); itera1++)
^^^^^^^^
由于此代码位于模板中,因此编译器不知道std::vector<registeredObject *>::iterator
是一种类型 - 您必须告诉它将前缀typename