如何让我的自己"模板图?

时间:2016-01-27 16:18:51

标签: c++ c++11 containers interface-implementation

我想实现自己的"简单"容器,它将具有地图属性,但也保持插入顺序。我听说过boost :: multi_index,但我觉得很难理解我想要的东西。

所以我做了一个模板化的课程:

template<typename KEY, typename VALUE>
class MyMap {
    private : 
        std::vector<KEY>    m_keys;
        std::vector<VALUE>  m_values;

    public :
        void insert(KEY& key, VALUE& val) {
            //Test if key exists //
            m_keys.push_back(key);
            m_values.push_back(val);
        }

        /* Other methods like erase/size/operator[]/begin/etc. */

};

为了测试它,我想做这样的事情:

int main() {
    MyMap<string,int> m;
    m.insert("test",1);
    m.insert("cat",2);

    for(auto& item : m) {
        cout << item << endl;
        cout << m[item] << endl;
    }
}

但是我一直在插入(和[])上遇到编译错误,因为它将我的KEY转换为basic_string而不是字符串。它让我发疯,我无法找到任何答案(或任何一个词来正确描述我的问题以研究答案)。我想这与分配器有关,但我无法理解如何解决它。 如何使我的地图进行此转换,但也保持一般性,因为我需要与其他(自己实现的)类一起使用?

编辑:解决&#34;字符串&#34;问题,我在传递int时遇到了问题,因为它正在等待&amp; int。遵循kebs建议并实施了一个矢量&gt;相反,摆脱了转换问题... :)

1 个答案:

答案 0 :(得分:0)

您无法从const char*构建引用(即使它被转换为字符串),请尝试这样做:

    template<typename KEY, typename VALUE>
    void insert(KEY key, VALUE val) {
        m_keys.push_back(key);
        m_values.push_back(val);
    }

更确切地说,编译器非常清楚这个问题:

  

错误:类型&#39; std :: basic_string&amp;&#39;的非const引用的初始化无效来自类型&#39; std :: basic_string&#39;的左值       m.insert(&#34;测试&#34;,1);