C ++模板类:实例化错误

时间:2014-03-14 16:01:05

标签: c++

我正在使用模板类进行项目。我差不多完成了。但是,当我编译程序时,我收到有关实例化的警告和错误。

In file included from /usr/include/c++/4.7/utility:72:0,
             from test.cpp:2:
/usr/include/c++/4.7/bits/stl_pair.h: In instantiation of ‘std::pair<_T1, _T2>&  
std::pair<_T1, _T2>::operator=(std::pair<_U1, _U2>&&) [with _U1 = int; _U2 = char; _T1 = const int; _T2 = char; std::pair<_T1, _T2> = std::pair<const int, char>]’:
map1.hpp:30:5:   required from ‘cs540::Node<Key, Value>::Node(std::pair<const Key, 
Value>, cs540::Node<Key, Value>*, cs540::Node<Key, Value>*) [with Key = int; Value = char; cs540::Node<Key, Value> = cs540::Node<int, char>]’
map1.hpp:121:7:   required from ‘void cs540::Map<Key, Value>::insert_node(cs540::Node<Key, Value>*, std::pair<const Key, Value>) [with Key = int; Value = char]’
map1.hpp:433:5:   required from ‘cs540::Map<Key, Value>::Iterator cs540::Map<Key, Value>::insert(const std::pair<const Key, Value>&) [with Key = int; Value = char]’
test.cpp:12:23:   required from here

我觉得,一旦我创建了该类的对象,Key和Value就已经实例化了。我创建了一个自定义Map类,假设它具有std :: map的功能。 我的所有类都在cs540命名空间下。

这是我的Node类:

template<class Key, class Value> class Node{
    /*Class member variables*/
    private:
        std::pair<const Key,Value> data;
    public: 
        Node<Key,Value>* rightChild;
        Node<Key,Value>* leftChild;
        Node<Key,Value>* next;
        Node<Key,Value>* previous;
        Node() :rightChild(nullptr),
            leftChild(nullptr),
            next(nullptr),
            previous(nullptr){/*Default constructor*/ }
        Node(std::pair<const Key,Value> dataIn, Node* rightIn, Node* leftIn):rightChild(rightIn),leftChild(leftIn){
            data = std::make_pair(dataIn.first, dataIn.second);     
        }       
        ~Node(){/*Destructor*/ }
        Key getKey(){ return data.first;}
        Value getValue(){ return data.second;}
        void setData(const Key key, Value value){ data = std::make_pair(key,value); }
        std::pair<const Key,Value> getData(){ return data;}
};

调用Node构造函数的函数

void insert_node(Node<Key,Value>* current, const std::pair<const Key,Value> newPair){

                if(current == nullptr){
                    num_size++;
                    current = new Node<Key,Value>(newPair,nullptr,nullptr);
                    return;
                }

                if(current->getKey() > newPair.first){
                    if(current->leftChild == nullptr){
                        num_size++;
                        current->leftChild = new Node<Key,Value>(newPair,nullptr,nullptr);
                        return;
                    }else{ insert_node(current->leftChild,newPair);}
                }else if(current->getKey() < newPair.first){
                    if(current->rightChild == nullptr){
                        num_size++;
                        current->rightChild = new Node<Key,Value>(newPair,nullptr,nullptr);
                        return;
                    }else{ insert_node(current->rightChild,newPair);}
                }else{  return;}
            }

最后但并非最不重要的是,我的主要功能

int main(void){

   cs540::Map<int,char> mapper;
   mapper.insert({1,'g'});
   return 0;
}

1 个答案:

答案 0 :(得分:3)

您尝试分配具有第一个元素const的数据,因此您无法对其进行修改。而不是在构造函数体中分配使用初始化列表的方式与用于rightChild和leftChild的方式相同:

data(dataIn.first, dataIn.second)