2010-04-13 41 views
0

我有,我繼承了真的老了項目幾類,最後我知道他們用的CodeWarrior 8編譯我現在的XCode 3.2模板 - >如何解密,決定是否需要並創建?

這裏是什麼,我掙扎的例子:

template <class registeredObject> 
typename std::vector<registeredObject>::iterator FxRegistry<registeredObject>::begin(void) 
{ 
    return mRegistryList.begin(); 
} 

的錯誤是:

no 'typename std::vector<registeredObject, std::allocator<_CharT> >::iterator FxRegistry<registeredObject>::begin()' member function declared in class 'FxRegistry<registeredObject>' 

template definition of non-template 'typename std::vector<registeredObject, std::allocator<_CharT> >::iterator FxRegistry<registeredObject>::begin()' 

如何決定如何解決這些和從哪裏開始找?

UPDATE:這裏是FxRegistry類別:

template <class registeredObject> 
class FxRegistry 
{ 
public: 
    // Construction 
    FxRegistry() {} 
    ~FxRegistry(); 

    // List management 
    void Register(const registeredObject &ob); 
    void Unregister(registeredObject &ob); 

    // List iteration 
    typedef std::vector<registeredObject>::iterator iterator; 
    typedef std::vector<registeredObject>::const_iterator const_iterator; 
    std::vector<registeredObject>::iterator begin(void); 
    std::vector<registeredObject>::const_iterator begin(void) const; 
    std::vector<registeredObject>::iterator end(void); 
     std::vector<registeredObject>::const_iterator end(void) const; 

    FxSize size(void); 
    void Insert(iterator iter,const registeredObject &ob); 
    registeredObject &operator[](FxInt32 index) { return mRegistryList[index]; } 
     void clear() {mRegistryList.clear();}; 
protected: 
    vector<registeredObject> mRegistryList; 
}; 

我在每行上得到的錯誤上面幾乎是: 錯誤:類型的std ::矢量>'不從類型 'FxRegistry' 衍生錯誤:預期';' 'iterator'之前

我以爲迭代器是矢量類型的,所以我會聲明一個矢量迭代器。

+1

好吧,錯誤消息似乎是說「*這個成員函數*沒有在類中聲明(你說它屬於)」。 – UncleBens 2010-04-13 22:51:49

回答

2
typedef std::vector<registeredObject>::iterator iterator; 
typedef std::vector<registeredObject>::const_iterator const_iterator; 
std::vector<registeredObject>::iterator begin(void); 
std::vector<registeredObject>::const_iterator begin(void) const; 
std::vector<registeredObject>::iterator end(void); 
    std::vector<registeredObject>::const_iterator end(void) const; 

在所有這些地方,你應該使用:

typename std::vector<registeredObject>::iterator 

iteratorconst_iterator依賴名稱(其含義取決於vector<X>可能包含的特定實例),並且該語言要求您告知它是否是類型名稱,因此co mpiler可以知道而不需要例示vector<X>

此外,使用您定義的typedefs也許有意義。

至於從哪裏開始 - 列表中的第一個錯誤。 :)

+0

@UncleBens - 我應該找出何時使用typedef和typename我不知道袖口。 – MLS 2010-04-13 23:20:53

+0

瞭解它是好的,但簡單的經驗法則是當編譯器抱怨某些模板時添加'typename'。 – 2010-04-13 23:47:02

+0

@Kristopher,簡單但不好的規則:) – 2010-04-15 19:39:45

0

檢查以下內容:

  • 是否有#include <vector>列入該頭文件之前?
  • protected部分類聲明中,vector不符合std::
  • 每個std::vector<registeredObject>::iterator和之前添加typename ... const_iterator使用
+0

@Kristopher - 我更新了這個定義的類的帖子。這是在一個單一的源文件中被稱爲FxRegistry.h – MLS 2010-04-13 23:02:28

相關問題