C belirtilen ÅŸablon parametreleri'deÄŸil 11 make_pair derleme
-Std=c 11 etkin g 4.7 (daha sonra anlık bir) ile oynuyordum. Varolan kod tabanı ve biraz kafamı karıştırdı başarısız bir durumda derlemeye çalıştım.
Biri neler olduğunu açıklayabilir sevinirim.
Ä°ÅŸte 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;
}
Make_pair olduğunu anlıyorumdemek(1) dava olarak kullanılır. (ben bu tür belirtirseniz, o zaman kullanın (3) olabilirim), Ama bu durumda başarısız olduğunu anlamıyorum.
Kesin hata:
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<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_T1>::__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<char>}’) to type ‘std::basic_string<char>&&’
Yine, burada sözkonusu olan sadece "neler oluyor?" Şablon şartname kaldırarak sorunu çözebilirsiniz biliyorum, ama ben yorganın altında burada başarısız olan şeyin ne olduğunu bilmek istiyorum. Şimdiden teşekkürler.
DÃœZENLEME:
- g 4.4 herhangi bir sorun ile bu kodu derler.
- Kaldırma -std=c 11 ayrıca herhangi bir sorun ile kodu derler.
CEVAP
Bu std::make_pair
kullanılmak üzere tasarlanmıştır nasıl değil, açıkça şablon değişkenleri belirtmek lazım.
C *8 11* iki bağımsız değişken, T&&
T
U
şablon parametreleri yazın nerede U&&
, türü alır. Etkili bir şekilde, bu gibi görünüyor (dönüş tipi yok sayarak):
template <typename T, typename U>
[return type] make_pair(T&& argT, U&& argU);
std::make_pair
ve açıkça Şablon Türü bağımsız değişkenleri belirtin aradığınızda, tartışma yok kesinti gerçekleşir. Bunun yerine, tür bağımsız değişkenleri doğrudan şablon bildirgesine göre, verimli değiştirilmiştir:
[return type] make_pair(std::string&& argT, int&& argU);
Bu parametre türleri de rvalue başvurular olduğunu unutmayın. Böylece, rvalues bağlamak sadece. Bu rvalue bir ifade olduğu için geçmesi ikinci bağımsız değişken için bir sorun, 7
deÄŸil. s
ancak, lvalue expression (taşınan değil geçici değil). Bu işlev şablon hatayı alıyorum bu yüzden bağımsız bir eşleşme anlamına gelir.
Neden T
U
şablon bağımsız değişken listesinde ne olduğunu açıkça belirtin yok ne işe yarıyor ki? Kısacası, rvalue başvuru parametreleri şablonları özel. Nedeniyle dil denilen bir özelliğe kısmenbaşvuru çöküyor, rvalue başvurusu A
tipi A
, her türlü bağlayabilirsiniz şablon parametre türü olduğu A&&
, parametre.
Hiç fark etmez ister A
bir lvalue, bir rvalue, sabit nitelikli, uçucu-vasıflı veya vasıfsız, A&&
baÄŸlayabilirsiniz bu nesne (yine, EÄŸer ve sadece eÄŸer A
kendisi bir ÅŸablon parametresi).
Sizin örnekte, çağrı yapalım
make_pair(s, 7)
Burada, s
std::string
7
30 ** türünde bir rvalue tip bir lvalue. İşlev şablonu argümanları belirtin olmadığınız için, şablon değişkeni kesintisi argümanlar ne olduğunu anlamak için yapılır.
BaÄŸlamak T&&
derleyici s
, bir lvalue, T
34**, 35* *türünde bir değişken getirili olmak şüpheleri. Başvurular olsa da, bu "referans" std::string&
olmak daraltır. çift yok s
bir maç.
Bu basit baÄŸlama 7
U&&
: derleyici olabilir anlamak U
int
, verimli bir parametre türü int&&
, bağlar başarıyla 7
çünkü bir rvalue.
Bu yeni dil özellikleri ile inceliklerini bir sürü vardır, ama eğer basit bir kural takip ederseniz, çok kolay:
Eğer şablon bağımsız değişken işlev bağımsız çıkarılabilir, çıkarılabilir olsun. Açıkça kesinlikle gerekir sürece bağımsız vermeyin.
Derleyici zor iÅŸi yapalım, ve ™.9 zaman zaten senin istediÄŸin de olacak. Ä°stediÄŸin bu olmadığı zaman, genellikle tanımlamak ve düzeltmek için kolay bir derleme hatası alırsınız.
3.1.0 ActionView::raylar Åžablon: Hata ...
URL sorgu parametreleri ile HTTP POST ...
Belirtilen adlandırılmış bağlantı yapı...
C şablon şablon parametreleri bazı kul...
DeÄŸil'benim derleme baÄŸlama t: ta...