2016-12-25 96 views
1

对于像<int, vector<vector<int>>>这样的pair类型使用unordered_map是否合法?没有函数模板“std :: make_pair”的实例匹配参数列表

void test(vector<int>& nums) 
{ 
    unordered_map<int, vector<vector<int>>> map; 
    unordered_map<int, unordered_set<int>> map2; 
    vector<vector<int>> results; 

    for (int i = 0; i < nums.size(); i++) 
    { 
     for (int m = i + 1; m < nums.size(); m++) 
     { 
      if (!map.count(i + m)) 
      { 
       vector<int> t{ i, m }; 
       vector<vector<int>> tt; 
       tt.push_back(t); 
       map.insert(make_pair<int, vector<vector<int>>>(i + m, tt)); 
       map2.insert(make_pair<int, unordered_set<int>>(i + m, unordered_set<int>(i - m))); 
      } 
      else if (map2.at(i + m).count(i - m) || map2.at(i + m).count(m - i)) 
      { 
       continue; 
      } 
      else 
      { 
       map.at(i + m).push_back(vector<int>{i, m}); 
       map2.at(i + m).insert(i - m); 
      } 
     } 
    } 

}

回答

5

这个问题似乎是std::make_pair():你应该有这样的Visual Studio警告我的std :: make_pair“函数模板没有实例 “中第16行参数列表”(map.insert(make_pair<int, vector<vector<int>>>(i + m, tt)))匹配模板推断适当的类型:

map.insert(std::make_pair(i + m, tt)); 

根据C++标准20.3.3 [pair.spec]段落9 std::make_pair()被声明是这样的:

template <typename F, typename S> 
std::pair<???, ???> make_pair(F&& first, S&& second) 

(为???填写适当的类型)。但是,您指定的类型与参数不匹配,实际上!如果你想正确指定类型,您使用

std::make_pair<int, std::vector<std::vector<int>>&>(i + m, tt) 
+0

确实如此,因为C++ 11。 http://en.cppreference.com/w/cpp/utility/pair/make_pair –

+0

为什么'std :: vector >>必须是一个正确匹配类型的引用? – SebNag

+1

@SebTu:模板参数通过转发参考(其类型意味着被推断)指定。当明确指定类型时,它与'&&'结合在一起。这样,当使用'X'作为类型时,你将有一个类型为'X &&'的参数,只有rvalues可以绑定。使用'X&'给出'X&&',它在引用崩溃后变为'X&',非''const'左值可以绑定到'X&'。参数'tt'是'std :: vector >'类型的非'constst'左值。你也可以在'&前面加一个'const',但在这种情况下不需要。 ......并且最好将这些类型关闭! –

1

你不应该给类型参数传递给make_pair;它应该推断出它们,然后将它们转发给一对值。

只需在make_pair之后删除<int, vector<vector<int>>>部分。

你可以传递类型并使其工作,但规则是神秘的,而且程序是无用的;通过传递类型,你做错了。

如果您想要传递类型,请将make_pair替换为pair并直接构造。 make_pair的点是而不是必须通过类型。

如果您想了解有关此特定错误的更多信息以及make对的工作方式,请阅读有关模板函数类型推导和转发参考的信息。

相关问题