使用模板时链接器错误

| 我正在尝试对项目进行受控的学习实验,它涉及创建我自己的集合和迭代器,本质上是一个数组和一个链表。我缺少一些东西,因为它编译时带有链接错误。我花了三天时间对此进行检查,编码和重新编码,我确实需要一些帮助。 我正在使用Visual Studio2010。我正在尝试新的C ++ 11内容,其中包含我认为的基于或的每个范围。在Visual C ++中为
for each (VAR in LIST)
,在GCC中为
for (VAR : LIST)
。 这是链接器错误:
main.obj : error LNK2001: unresolved external symbol \"public: virtual class Iterator<int> __thiscall Container<int>::begin(void)const \" (?begin@?$Container@H@@UBE?AV?$Iterator@H@@XZ)
main.obj : error LNK2001: unresolved external symbol \"public: virtual class Iterator<int> __thiscall Container<int>::end(void)const \" (?end@?$Container@H@@UBE?AV?$Iterator@H@@XZ)
我的代码如下:
template<typename T>
class Iterator
{
public:
    Iterator(T* Start) : Current(Start) { }
    const T& operator*() const { return *Current; }
    const T* operator->() const { return Current; }
    Iterator<T>& operator++() { Current++; return *this; }
    bool operator!=(Iterator<T> &Other) { return Current != Other.Current; }

protected:
    T* Current;
};

template<typename T>
class Container
{
public:
    Container() : Count(0) { }
    Container(unsigned int Count) : Count(Count) { }

    unsigned int GetCount() const { return Count; }
    bool IsEmpty() const { return Count == 0; }
    Iterator<T>& GetIterator() const { return begin() };

    // Compatibility with C++0x range-based for requires begin() and end() functions.
    virtual Iterator<T> begin() const;
    virtual Iterator<T> end() const;

protected:
    unsigned int Count;
};

template<typename T>
class ArrayList : public Container<T>
{
public:
    ArrayList() : Items(nullptr), Container(0) { }

    virtual Iterator<T> begin() const
    { 
        return Iterator<T>(Items);
    }

    virtual Iterator<T> end() const
    { 
        return Iterator<T>(Items + Count);
    }

private:
    T *Items;
};

int main()
{
    ArrayList<int> MyList;
    for each (auto Item in MyList)
    { }
    return MyList.GetCount();
}
    
已邀请:
在Container类中,应将begin()和end()声明为:
virtual Iterator<T> begin() const = 0;
virtual Iterator<T> end() const = 0;
    
看起来很简单,Collection类中begin和end函数的实现在哪里?
virtual Iterator<T> begin() const;
virtual Iterator<T> end() const;
您必须为每个选项都具有指定的实现,这就是导致链接器错误的原因。     
只要基类包含非纯虚方法,就需要在某个地方定义它们。否则,在创建派生类对象时,它将产生链接器错误,例如未定义的引用/符号。 如果不想定义
Container::begin()
Container::end()
,则将它们声明为
pure virtual
。 在这里,我已经回答了类似的问题。     
“ 9”是Microsoft .NET,例如。托管C ++,又称C ++ / CLI。真正的C ++ 11版本实际上是10英镑。 接下来,您在
Container
中没有实现
begin
end
方法。 最后,仅在使用指向基本类型的指针时使用虚函数,例如:
Container* myCont = new ArrayList<int>();
auto it = myCont->begin();
将调用
ArrayList<int>::begin()
函数。也就是,对于容器而言,虚拟功能实际上是无用的(无双关语)。     

要回复问题请先登录注册