我正在执行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;
}
};
然后报告了错误:
Line 42: Char 59: error: no matching function for call to `make_pair<TreeNode*, int>(TreeNode*&, int&))`
为什么会发生错误,并且make_pair<>()
中的参数成为引用?有人可以帮忙吗?
我将make_pair<TreeNode*, int>(root, result)
修改为make_pair(root, result)
,然后它起作用了。它们之间有什么区别?
TL; DR:不指定std::make_pair
的模板参数。让编译器推断它们。
std::make_pair
的模板参数的含义在C ++ 11中已更改。
过去是:
std::make_pair
但是现在是:
template <class T1, class T2> /*...*/ make_pair( T1 t, T2 u );
该代码在C ++ 11之前是有效的,但现在不再有效。
您可以相应地更改模板参数:template <class T1, class T2> /*...*/ make_pair(T1 &&t, T2 &&u);
// `t` and `u` are forwarding references.
,但是没有理由手动指定它们。编译器可以推断出它们很好。
如果您不理解为什么必须将模板参数用作引用,请阅读转发引用。
为什么...
make_pair<TreeNode*&, int&>(root, result)
中的参数成为引用?
可能您的编译器将参数类型显示为引用,以指示您正在将左值传递给make_pair<>()
。