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.

Heroku Raylar varlıklar boru hatları a...
Güncellemelerinden herhangi bir proje ...
Neden bu Java 8 program derleme deÄŸil ...
Eclipse "bu derleme birimi java p...
Eclipse sınıfları tasarruf otomatik de...