2015-11-05 4 views
1

Я пытаюсь перегрузить оператор индекса, чтобы использовать его для заполнить шаблон, который используется в классе карты.Шаблоны C++ и перегрузка оператора индекса

Это структура шаблона

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]; 
}; 

Я хочу, чтобы перегрузить оператор подстрочного так, чтобы Я могу поставить ключ и значение в 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]; 
} 

Ошибки:

нелегальный индекс не позволил

инициализация не может конвертировать из инициализаторе в узел

+3

'Node newNode = {newNode.Key = Key};' Ehrm ... Что ? –

+3

Этот вопрос связан не с оператором индекса, а с проблемой инициализации структуры. Если вы соответствующим образом отредактируете заголовок и уменьшите проблему, вы можете получить более качественные ответы. (т. е. проблема, отмеченная @SimonKraemer, также должна быть проблемой в другом контексте.) – anderas

+0

Да, я исправил это, проблема в том, что он все еще работает с индексом. – Lawtonj94

ответ

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; 
} 
+0

Я пробовал, что уже получаю, я не могу преобразовать из Node в int &, но также я хочу вернуть эту позицию массива, так как именно здесь узел, который я хочу присвоить вам, будет расположен. – Lawtonj94

+0

Возможно, вам стоит обновить вопрос и описать, чего вы пытаетесь достичь. Если возможно, пример. _ «Я получаю не могу преобразовать из Node в int &" _ Если 'V' имеет тип 'int', он будет работать. Я обновляю свой ответ на MVCE –