std :: make_pair:无法将'ch'(类型'char')转换为'char &&'[duplicate]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了std :: make_pair:无法将'ch'(类型'char')转换为'char &&'[duplicate]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
以下代码有什么问题:
#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 << '
';
vec.push_back( std::make_pair< char, unsigned >( ch, number ) );
}
}
它可以很好地编译:
g++ test.cxx
但失败了:
$ 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&&'
解:
而不是以这种方式显式指定make_pair<>()
的模板参数:
std::make_pair< char, unsigned >( ch, number )
只是让他们推断:
std::make_pair( ch, number )
说明:
这个指南背后的基本原理可以通过定义std::make_pair<>()
的方式找到,并且模板参数推导的方式适用于通用引用。从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确定如下:让Ui
为每个decay<Ti>::type
的Ti
。然后每个Vi
是X&
,如果Ui
等于reference_wrapper<X>
,否则Vi
是Ui
。 [例子:代替:
return pair<int, double>(5, 3.1415926); // explicit types
C ++程序可能包含:
return make_pair(5, 3.1415926); // types are deduced
- 末端的例子]
在这里,T1
和T2
意在推断。通过自己明确指定模板参数,您将开始使用make_pair<>()
的类型推导机制来生成正确的返回类型,强制实例化接受对char
的rvalue引用的函数,以及对unsigned
的rvalue引用:
... make_pair(char&&, unsigned&&)
但是,你没有在输入中提供rvalues,因为ch
和number
是左值。这就是编译器所抱怨的。
替代方案:
另请注意,您可以隐式构造一个std::pair
对象,这样就可以节省您对make_pair<>()
的调用:
vec.push_back( { ch, number } );
以上是关于std :: make_pair:无法将'ch'(类型'char')转换为'char &&'[duplicate]的主要内容,如果未能解决你的问题,请参考以下文章
no matching function for call to 'make_pair(std::string&, size_t&)'
没有函数模板“std::make_pair”的实例与参数列表匹配