2013-02-26 3 views
6

Что случилось со следующим кодом:станд :: make_pair: не может преобразовать «сп» (типа «символ»), чтобы напечатать «символ &&»

#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++ 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&&' 
+1

Почему на земле вы бы пройти шаблонные аргументы в 'std :: make_pair' в первую очередь ..? – ildjarn

ответ

14

РЕШЕНИЕ:

Вместо явного указания аргументов шаблона для make_pair<>() таким образом:

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

Просто дайте им быть выведено:

std::make_pair(ch, number) 

ОБЪЯСНЕНИЕ:

Обоснованием этого руководство найдено на пути std::make_pair<>() i s и в способе вычитания аргументов шаблона для универсальных ссылок. Из пункта 20.3.3/8-9 из C++ 11 стандарта на:

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<>() для получения правильного типа возврата, заставляя создавать функцию, которая принимает значение rvalue для char, а также значение rvalue для unsigned:

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

Однако, вы не обеспечивают rvalues ​​на входе, так и chnumber являются lvalues. Об этом жалуется компилятор.


АЛЬТЕРНАТИВА:

заметить также, что вы можете неявно построить в std::pair объект, который сохраняет ваши от вызова make_pair<>() вообще:

vec.push_back({ ch, number }); 

 Смежные вопросы

  • Нет связанных вопросов^_^