0
class MtmMap {   
    public:    
    class Pair {     
         public:   
         Pair(const KeyType& key, const ValueType& value) :     
             first(key),       
             second(value) { }    
         const KeyType first;    
         ValueType second;    
     };     
    class node {    
        friend class MtmMap;    
        Pair data;    
        node* next;     
        public:    
        node();    
        node(const Pair& pair){
            data.Pair(pair.first , pair.second);
            next = NULL;
        }    
    };
    node* temp = new node(pair);
}

错误:

没有匹配函数调用 'mtm::MtmMap<int, int, AbsCompare>::Pair::Pair()'
无效使用 'mtm::MtmMap<int, int>::Pair::Pair'
需要来自 ' void mtm::MtmMap::insert(const
mtm::MtmMap<KeyType, ValueType, CompareFunction>::Pair&) [with KeyType = int; 值类型 = 整数;
CompareFunction = AbsCompare]'

4

2 回答 2

0

通过定义Pair带参数的构造函数,您可以删除不带参数的隐式默认构造函数。当你有一个类型的成员时,Pair必须node在节点的初始化列表中将参数传递给它,你需要用这个替换你的节点构造函数:

    node(const Pair& pair) : data(pair.first, pair.second) {
        next = NULL;
    }

这将data正确调用构造函数。Learn Cpp有一个关于初始化列表如何工作的教程,您可能想阅读它。

于 2013-01-21T10:16:58.890 回答
0

我首先想到的是这一行:

node* temp = new node(pair);

看起来您正在尝试new在类定义中创建一个类。这可能是问题的一部分。此外,这个区域看起来有点混乱:

node(const Pair& pair){
  data.Pair(pair.first , pair.second);
  next = NULL;
}

看起来您正在尝试Pair直接调用构造函数。我不确定这是否是有效的 C++。真的,只需Pair像这样定义一个复制构造函数:

Pair( Pair const& other )
  : first( other.first )
  , second( other.second )
{}

然后,该块变为

node( Pair const& pair )
  : data( pair )
  , next( NULL )
{}

您也可以查看std::pair.

于 2013-01-22T04:06:23.540 回答