C++ 模板-->;如何破译、决定是否需要并创建?

C++ 模板-->;如何破译、决定是否需要并创建?,c++,templates,C++,Templates,在我继承的一个项目中,我有几个类非常古老,上次我知道它们是用CodeWarrior 8编译的。我现在使用的是XCode 3.2 下面是一个我正在努力解决的问题的例子: template <class registeredObject> typename std::vector<registeredObject>::iterator FxRegistry<registeredObject>::begin(void) { return mRegistry

在我继承的一个项目中,我有几个类非常古老,上次我知道它们是用CodeWarrior 8编译的。我现在使用的是XCode 3.2

下面是一个我正在努力解决的问题的例子:

template <class registeredObject> 
typename std::vector<registeredObject>::iterator FxRegistry<registeredObject>::begin(void)
{
    return mRegistryList.begin();
}
模板
typename std::vector::iterator FxRegistry::begin(void)
{
返回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()'
no'typename std::vector::iterator FxRegistry::begin()'类'FxRegistry'中声明的成员函数
非模板“typename std::vector::iterator FxRegistry::begin()”的模板定义
我如何决定如何解决这些问题,从哪里开始寻找

更新:以下是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;
};
模板
类FxRegistry
{
公众:
//建筑
FxRegistry(){}
~FxRegistry();
//列表管理
无效登记册(const registeredObject&ob);
作废注销(注册对象和ob);
//列表迭代
typedef std::vector::迭代器迭代器;
typedef std::vector::const_迭代器const_迭代器;
std::vector::迭代器开始(void);
std::vector::const_迭代器begin(void)const;
std::vector::迭代器结束(void);
std::vector::const_迭代器end(void)const;
FxSize大小(void);
无效插入(迭代器iter、常量registeredObject和ob);
registeredObject和运算符[](FxInt32索引){return mRegistryList[index];}
void clear(){mRegistryList.clear();};
受保护的:
向量表;
};
我发现上面的每一行都有错误,几乎是: 错误:类型“std::vector>”不是从类型“FxRegistry”派生的 错误:应为“;”在“迭代器”之前

我认为迭代器是向量类型的,所以我要声明一个向量迭代器。

检查以下内容:

  • 在包含该标题之前是否有
    #include
  • 在类声明的
    protected
    部分中,
    vector
    不符合
    std::
  • typename
    添加到
    std::vector::iterator
    和..
    const_iterator
    使用的每个
  • typedef std::vector::iterator迭代器;
    typedef std::vector::const_迭代器const_迭代器;
    std::vector::迭代器开始(void);
    std::vector::const_迭代器begin(void)const;
    std::vector::迭代器结束(void);
    std::vector::const_迭代器end(void)const;
    
    在所有这些地方,您应该使用:

    typename std::vector<registeredObject>::iterator
    
    typename std::vector::iterator
    
    iterator
    const\u iterator
    是相关名称(它们的含义取决于
    vector
    的特定实例化可能包含的内容),并且该语言要求您判断它是否是类型名,这样编译器就可以知道,而无需实例化
    vector

    此外,使用您定义的typedef也可能有意义


    关于从什么开始-列表中的第一个错误。:)

    嗯,错误消息似乎在说“这个成员函数没有在类中声明(你说它属于)”。@Kristopher-我用定义它的类更新了帖子。这都在一个名为FxRegistry的源文件中。h@UncleBens-我应该立即找出何时使用typedef和typename,我不知道。理解这一点很好,但简单的经验法则是,每当编译器抱怨模板有问题时,添加
    typename
    。@Kristopher,简单但糟糕的规则:)
    typename std::vector<registeredObject>::iterator