Właśnie grałem z g ++ 4.7 (jedną z późniejszych migawek) z włączoną opcją -std = C++ 11. Próbowałem skompilować część istniejącej bazy kodu i jedna sprawa, która się nie powiodła, nieco mnie zakłopotała.C++ 11 make_par z określonymi parametrami szablonu nie kompiluje się
Byłbym wdzięczny, gdyby ktoś mógł wyjaśnić, co się dzieje.
Oto kod
#include <utility>
#include <iostream>
#include <vector>
#include <string>
int main ()
{
std::string s = "abc";
// 1 ok
std::pair < std::string, int > a = std::make_pair (s, 7);
// 2 error on the next line
std::pair < std::string, int > b = std::make_pair < std::string, int > (s, 7);
// 3 ok
std::pair < std::string, int > d = std::pair < std::string, int > (s, 7);
return 0;
}
Rozumiem, że make_pair jest oznaczało być stosowany jako (1) sprawy (jeśli określić typy, to równie dobrze można użyć (3)), lecz Nie rozumiem, dlaczego w tym przypadku nie działa.
Dokładny błędu:
test.cpp: In function ‘int main()’: test.cpp:11:83: error: no matching function for call to ‘make_pair(std::string&, int)’ test.cpp:11:83: note: candidate is: In file included from /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/utility:72:0, from test.cpp:1: /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:274:5: note: template constexpr std::pair::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&) /gcc4.7/usr/local/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../../include/c++/4.7.0/bits/stl_pair.h:274:5: note: template argument deduction/substitution failed: test.cpp:11:83: note: cannot convert ‘s’ (type ‘std::string {aka std::basic_string}’) to type ‘std::basic_string&&’
Znowu tutaj pytanie jest po prostu „co się dzieje?” Wiem, że mogę rozwiązać ten problem, usuwając specyfikację szablonu, ale chcę tylko wiedzieć, co się tu nie udaje pod kołdrą. Z góry dziękuję.
EDIT:
- g ++ 4.4 kompiluje kod bez żadnych problemów.
- Usuwanie -std = C++ 11 również kompiluje się z kodem bez żadnych problemów.
doskonałe pytanie. Kolejny przykład subtelnej zmiany w C++ 11, podobnie jak [zmiana zerwania konstrukcji 'std :: vector'] (http://stackoverflow.com/questions/5759232/stdvector-default-construction-c11- i łamanie zmian). Przynajmniej ten powoduje błąd kompilatora, a nie cichą zmianę semantyki. –
Jeśli mam zmienną całkowitą i. Chcę utworzyć parę z i i innym obiektem. Jak dokładnie powinienem nazywać makepair. 1) make_pair <*i, obj> 2) int && j = i; make_pair? Oba nie działają. Co to jest właściwy sposób? –
PHcoDer