所以我需要使用模板类作为容器,所以我需要创建一个从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;是非法的。
答案 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;