尝试生成STL映射容器的包装器时出错

时间:2010-10-17 07:35:48

标签: c++ templates stl map const

我正在尝试为STL映射容器创建一个包装器,以便添加一个const方法来返回给定键的值。在map中,operator []不是const,而find()需要解除引用才能获取值(map.find() - > second)。顺便说一下,我的一些“研究”基于Idiomatic C++ for reading from a const map

到目前为止的代码(全部在单个头文件中):

#include <map>
template <typename K, typename V>
class easymap : public std::map<K, V>
{
    //Constructor
    easymap() : std::map<K, V>() {};

    //The get method
    V get(K key)
    {
        std::map<K, V>::const_iterator iter(find(key));
        return iter != end() ? iter->second : V();
    }
};

当我尝试编译时,我收到以下错误:

In member function `V easymap::get(K)':
    expected `;' before "iter"
`iter' was not declared in this scope
there are no arguments to `end' that depend on a template parameter, so a declaration of `end' must be available|
(if you use `-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)

我是如何尝试这样做有意义的?如果是这样,我该如何工作呢?如果没有,我将如何实现我正在寻找的效果?

3 个答案:

答案 0 :(得分:3)

不要派生自std::map。而是在继承原则之前的组合之后,在std::map中包装easymap实例。除了所有技术原因之外,这更好地反映了设计意图:提供简化的API来映射隐藏默认值:

template<typename K, typename V>
class easymap {
 std::map<K, V> mMap;
public:
  V Get(K Key) const {
   // ...
  }
};

答案 1 :(得分:2)

您缺少map的模板参数,在声明迭代器时必须指定typename(请参阅here),由于某些原因我不知道(可能是命名空间冲突),您必须在致电this时使用end()

template <typename K, typename V>
class easymap : public std::map<K,V>
{
    //Constructor
    easymap() : std::map<K, V>() {};

    //The get method
    V get(K key)
    {
        typename std::map<K, V>::const_iterator iter(find(key));
        return iter != this->end() ? iter->second : V();
    }
};

答案 2 :(得分:2)

使用STL容器作为基类并不是一个好主意。你应该有一个非常好的理由去做,并且要非常小心。

原因是,没有一个STL容器有virtual析构函数。因此,如果你有一个指针(例如std::map<..> *)指向你的对象(继承了map),其中一个析构函数将被调用。这是100%的内存泄漏。

与此相关的问题是:Is it okay to inherit implementation from STL containers, rather than delegate?