C ++模板和重载下标运算符

时间:2015-11-05 11:17:01

标签: c++ templates operator-overloading

  

我正在尝试重载下标运算符以便使用它   填写地图类中使用的模板。

这是模板结构

  template<typename K, typename V>
    struct Node
    {
        V       Value;
        K       Key;
    };

在本课程中使用

地图类

template<typename K, typename V>
class myMap
{
public:
    myMap();
    ~myMap();

    V& operator[] (const K Key);

private:
    const int       mInitalNumNodes = 10;   //Start length of the map
    int             mNumOfNodes;            //Count of the number of Nodes in the map
    int             mCurrentPostion;
    Node<K,V>       mNodeList[10];
};

我想重载下标运算符,以便我可以通过此函数调用将一个Key和一个值放入mNodeList。

分类和操作员调用

myMap<char, int> x;
x[1] = 2;

如果我在过载实施中遇到错误,你可以指出我正确的方向。

运营商超载

template<typename K, typename V>
inline V& myMap<K, V>::operator[](const K Key)
{
    // TODO: insert return statement here
    Node<K, V> newNode;
    newNode.Key = Key;

    mNodeList[mCurrentPostion] = newNode;
    mCurrentPostion++;
    return mNodeList[&mCurrentPostion-1];
}

错误:

不允许非法索引

初始化无法从初始化程序转换为节点

1 个答案:

答案 0 :(得分:1)

你的回归是错误的。你最想要的是

return mNodeList[mCurrentPostion - 1].Value;

而不是

return mNodeList[&mCurrentPostion-1];

<强> MCVE:

template<typename K, typename V>
struct Node
{
    K       Key;
    V       Value;
};

template<typename K, typename V>
class myMap
{
public:
    myMap()
        :mCurrentPostion(0)
        ,mNumOfNodes(0)
    {}
    ~myMap() {}

    V& operator[] (const K Key);

private:
    const int       mInitalNumNodes = 10;   //Start length of the map
    int             mNumOfNodes;            //Count of the number of Nodes in the map
    int             mCurrentPostion;
    Node<K, V>       mNodeList[10];
};


template<typename K, typename V>
inline V& myMap<K, V>::operator[](const K Key)
{
    // TODO: insert return statement here if Key already exists
    Node<K, V> newNode;
    newNode.Key = Key;
    mNodeList[mCurrentPostion] = newNode;
    mCurrentPostion++;
    return mNodeList[mCurrentPostion - 1].Value;
}

int main()
{
    myMap<char, int> x;
    x[1] = 2;
}