2013-02-26 13 views
6

什麼是錯用下面的代碼:的std :: make_pair:不能轉換 '通道'(類型 '字符')鍵入 '字符&&'

g++ test.cxx 

#include <ctime> 
#include <vector> 
#include <utility> 
#include <algorithm> 
#include <iostream> 

int main() 
{ 
    std::vector< std::pair< char, unsigned > > vec; 

    for(unsigned i = 0; i < 100; ++i) 
    { 
     char ch = 0; 
     unsigned number = 0; 

     do { 
      ch = i; 
      number = i; 

     } while(std::find(vec.begin(), vec.end(), std::make_pair< char, unsigned >(ch, number)) != vec.end()); 

     std::cout << ch << number << '\n'; 

     vec.push_back(std::make_pair< char, unsigned >(ch, number)); 
    } 
} 

它有很好的編譯

但失敗:

$ g++ -std=c++11 test.cxx                            /tmp 
test.cxx: In function 'int main()': 
test.cxx:21:98: error: no matching function for call to 'make_pair(char&, unsigned int&)' 
test.cxx:21:98: note: candidate is: 
In file included from /usr/include/c++/4.7/bits/stl_algobase.h:65:0, 
       from /usr/include/c++/4.7/vector:61, 
       from test.cxx:3: 
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&) 
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note: template argument deduction/substitution failed: 
test.cxx:21:98: note: cannot convert 'ch' (type 'char') to type 'char&&' 
test.cxx:25:69: error: no matching function for call to 'make_pair(char&, unsigned int&)' 
test.cxx:25:69: note: candidate is: 
In file included from /usr/include/c++/4.7/bits/stl_algobase.h:65:0, 
       from /usr/include/c++/4.7/vector:61, 
       from test.cxx:3: 
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&) 
/usr/include/c++/4.7/bits/stl_pair.h:268:5: note: template argument deduction/substitution failed: 
test.cxx:25:69: note: cannot convert 'ch' (type 'char') to type 'char&&' 
+1

爲什麼地球上,你會通過模板參數首先放在'std :: make_pair'中..? – ildjarn 2013-02-26 23:37:15

回答

14

SOLUTION:

而不是明確指定模板參數make_pair<>()這樣:

std::make_pair< char, unsigned >(ch, number) 

只是讓他們可以推斷:

std::make_pair(ch, number) 

說明:

這樣做的理由指南在std::make_pair<>()我找到s的定義,以及模板參數推導的方式適用於通用引用。從段落的C++ 11標準的20.3.3/8-9:

template <class T1, class T2> pair<V1, V2> make_pair(T1&& x, T2&& y);

返回pair<V1, V2>(std::forward<T1>(x), std::forward<T2>(y)); 其中V1和V2被確定爲如下:令Uidecay<Ti>::type爲每個Ti。然後,如果Ui等於reference_wrapper<X>,則每個ViX&,否則ViUi。 [:作爲替代的:

return pair<int, double>(5, 3.1415926); // explicit types

C++程序可包含:

return make_pair(5, 3.1415926); // types are deduced

- 端示例]

這裏,T1T2意味着被推斷。通過你自己明確地指定模板參數,你會越來越多的類型推導機制產生正確的返回類型,強制實例化一個函數,該函數接受右值引用到char和rvalue引用到unsigned

... make_pair(char&&, unsigned&&) 

但是,您沒有在輸入中提供右值,因爲chnumber是左值。這是編譯器所抱怨的。


替代方案:

另請注意,您可以隱含構建std::pair對象,這與調用make_pair<>()都保存您:

vec.push_back({ ch, number }); 
相關問題