从stl集导出

时间:2014-10-30 14:37:59

标签: c++ c++-standard-library

所以我需要使用模板类作为容器,所以我需要创建一个从STL集派生的新关联容器,到目前为止这就是我所拥有的(相关部分的代码片段)。 / p>

在UpdatableSet.h中

#include <set>

template <class T>
class UpdatableSet : public std::set<T>
{
public:
    UpdatableSet(){};
    ~UpdatableSet(){};
    bool add(T);
private:
    std::set<T> set;
};

add(T),这个方法应该将T添加到集合中,如果成功,返回true,或返回false,不确定这是否正确,因为我不完全理解概念。

template <class T>
bool UpdatableSet<T>::add(T update)
{

    if(set.insert(update).good())
    {
        return true;
    }
    else 
        return false;

}

中的

UpdatableSet<CDAlbum> updatableAlbumSet; //Want this to be a set of objects of the CDAlbum kind
updatableAlbumSet.add(theCDAlbum); //how do I use this to add to the set?

最终我收到此编译错误

文件中的符号 bool UpdatableSet :: add(CDAlbum)task2Main.o ld:致命:符号引用错误。没有输出写入a.out

编辑: 所以你们是对的,我已经发现自己需要自己创建这些方法,而不是从set中派生出来。

这里现在的样子

在UpdatableSet.h中

template <class T>
class UpdatableSet
{



    public:
    UpdatableSet(){};
    ~UpdatableSet(){};
    bool add(T);
    int size();
    int begin();
    int end();
    typedef typename set<T>::iterator iterator;

    private:
    std::set<T> set;

};

template <class T>
bool UpdatableSet<T>::add(T update)
{
    return set.insert(update).second;
}

template <class T>
int UpdatableSet<T>::size()
{
    return set.size();
}

template <class T>
int UpdatableSet<T>::begin()
{
    return set.begin();
}

template <class T>
int UpdatableSet<T>::end()
{
    return set.end();
}

但是我现在收到此错误 &#34; task2Main.cpp&#34;,第67行:错误:无法使用int初始化__rwstd :: __ rb_tree,std :: less,std :: allocator&gt; :: const_iterator。

&#34; task2Main.cpp&#34;,第67行:错误:操作&#34; __ rwstd :: __ rb_tree,std :: less,std :: allocator&gt; :: const_iterator!= int&#34;是非法的。

1 个答案:

答案 0 :(得分:2)

不要继承std::set<T>。强烈使用它作为私人成员。特别是不要这两个 - 这甚至意味着什么?你的对象既是IS-A又是HAS-A集?否。

其次,这一行:

if(set.insert(update).good())

set::insert()方法返回pair<iterator, bool>。那里没有good()方法。如果您想检查是否成功,您可以这样做:

if (set.insert(update).second)

但是,既然您无论如何都有效地转发结果,那么您应该这样做:

return set.insert(update).second;