2011-04-18 122 views
2

我覺得我的問題是模板相關的,但我只是不知道。我喜歡歌廳的錯誤:C++模板幫助

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; 
    } 
} 

可以任何人揭示了什麼錯誤一些輕?

UPDATE:mRegistryList定義vector<registeredObject *> mRegistryList;

UPDATE:伊特拉是限定typedef typename std::vector<pair<identifier,registeredObject> >::iterator iter;

UPDATE 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

告訴它將其視爲類型。什麼是mRegistryList?你是如何定義itera1的? – Bart 2011-04-18 21:35:49

+0

請編輯和粘貼'mRegistryList'的定義。 – 2011-04-18 21:36:27

+0

你可以添加mRegistryList和itera1的聲明嗎? – 2011-04-18 21:37:30

回答

5

你的迭代器類型不匹配mRegistryListvector的迭代器類型。

迭代器: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

+0

@Erik,我不遵循這個意思 – JTS 2011-04-18 21:39:39

+0

@JTS:查看更新回答 – Erik 2011-04-18 21:42:12

+0

@Erik,哦,所以我使用了錯誤的對象類型? – JTS 2011-04-18 21:44:29