C++ 在C++;

C++ 在C++;,c++,stl,C++,Stl,我在做leetcode的问题337。这是我实现的代码 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public:

我在做leetcode的问题337。这是我实现的代码

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int rob(TreeNode* root) {

        unordered_map<TreeNode*, int> memo;

        return robSub(root, memo);
    }

private:
    int robSub(TreeNode* root, unordered_map<TreeNode*, int>& memo) {

        if (root == nullptr) {
            return 0;
        }

        if (memo.find(root) != memo.end()) {
            return memo.find(root)->second;
        }

        int leftGrand = 0;
        int rightGrand = 0;

        if (root->left != nullptr) {
            leftGrand = robSub(root->left->left, memo) + robSub(root->left->right, memo);
        }
        if (root->right != nullptr) {
            rightGrand = robSub(root->right->left, memo) + robSub(root->right->right, memo);
        }

        int result = max(root->val + leftGrand + rightGrand, robSub(root->left, memo) + robSub(root->right, memo));

        memo.insert(make_pair<TreeNode*, int>(root, result));
        return result;

    }
};
/**
*二叉树节点的定义。
*树状结构{
*int-val;
*TreeNode*左;
*TreeNode*对;
*TreeNode(intx):val(x),左(NULL),右(NULL){
* };
*/
类解决方案{
公众:
int rob(树节点*根节点){
无序地图备忘录;
返回robSub(根,备忘录);
}
私人:
int robSub(树节点*根节点,无序地图和备忘录){
if(root==nullptr){
返回0;
}
if(memo.find(root)!=memo.end()){
返回备忘。查找(根)->秒;
}
int-leftGrand=0;
int-rightGrand=0;
如果(根->左!=nullptr){
leftGrand=robSub(根->左->左,备忘录)+robSub(根->左->右,备忘录);
}
如果(根->右!=nullptr){
rightGrand=robSub(根->右->左,备忘录)+robSub(根->右->右,备忘录);
}
int result=max(root->val+leftGrand+righgrand,robSub(root->left,memo)+robSub(root->right,memo));
备注.插入(生成一对(根,结果));
返回结果;
}
};
然后它报告了一个错误:

Line 42: Char 59: error: no matching function for call to `make_pair<TreeNode*, int>(TreeNode*&, int&))`
第42行:字符59:错误:调用'make_pair(TreeNode*&,int&')没有匹配的函数`
为什么会发生错误并且
make\u pair()
中的参数会成为引用?有人能帮忙吗


我将
make\u-pair(root,result)
修改为
make\u-pair(root,result)
,然后它工作了。它们之间有什么区别;DR:不要指定
std::make\u pair
的模板参数。让编译器推断它们


在C++11中更改了的模板参数的含义

过去是:

template <class T1, class T2> /*...*/ make_pair( T1 t, T2 u );
template/*…*/配对(T1 t,T2 u);
但现在是:

template <class T1, class T2> /*...*/ make_pair(T1 &&t, T2 &&u);
// `t` and `u` are forwarding references.
template/*…*/make_对(T1&t,T2&u);
//'t'和'u'正在转发参考资料。
该代码在C++11之前是有效的,但现在不再有效

您可以相应地更改模板参数:
make\u pair(root,result)
,但没有理由手动指定它们。编译器可以很好地推断出它们

如果您不理解为什么模板参数必须是引用,请阅读有关转发引用的内容


为什么。。。
make_pair()
中的参数是否成为引用

您的编译器可能会将参数类型显示为引用,以指示您在使用

unordered_map<TreeNode*, int>& memo
使用
make_pair()
的唯一原因是让编译器选择模板参数(少键入,一个通用的
pair
ctor)。如果要显式指定类型,可以使用普通的
对。在这种情况下,我会把它看作是<>代码> unordeDeMAP的实现细节,而使用其嵌套的Type。那个typedef是顺便说一句。
std::pair


所有这一切只给我留下了一个问题:为什么不使用
memo[root]=result

请不要向我们显示文本图像,而是复制粘贴文本本身。请看,您应该在问题的后面加上一个,其中所有不必要的代码都会被删除。作为一个新用户,也需要阅读。问题是
make\u-pair
变成
make\u-pair(TreeNode*&&,int&&)
。这不会起作用,因为
root
result
都是左值。这很清楚,@NathanOliver.monica,所以我不知道你为什么要提到这个!?特别是,我并不建议在这种情况下使用
make\u pair()
!你说你想插入一个元素:你想插入一个元素:memo.insert(make_pair(root,result));有几个重载可以匹配。我的猜测(但请考虑一下)是您想要一个以const-value\u-type&作为参数的参数。我只是引用了原问题的相关部分,并试图解释它们的意图。
memo.insert(make_pair<TreeNode*, int>(root, result));
memo.insert(unordered_map<TreeNode*, int>::value_type(root, result));