Bir std::pair
ve aynı zamanda çiftin türlerinden birinin değerini alan bir işlev şablonum var. Bu işlevi, bir ikili argümanı olarak std::map
'dan bir giriş kullanarak aramak istiyorum.Şablon bağımsız değişkendeki const/const-const uyuşmazlığı nasıl giderilir
#include <map>
#include <utility>
template <typename T1, typename T2>
void do_stuff(std::pair<T1, T2> const &pair, T1 const &val) {
// Imagine that this does something important...
}
int main() {
std::map<int, float> foo { { 0, 0.0 } };
do_stuff(*foo.begin(), 0);
}
Bu haritanın girişinin türü std::pair<const int, float>
çünkü derlenmeyecektir, böylece T1
tip kesinti çelişkili tipleri vardır: val
argüman yoluyla pair
argüman yoluyla const int
ve int
.
test.cc: In function ‘int main()’:
test.cc:12:27: error: no matching function for call to ‘do_stuff(std::pair<const int, float>&, int)’
do_stuff(*foo.begin(), 0);
^
test.cc:5:6: note: candidate: template<class T1, class T2> void do_stuff(const std::pair<_T1, _T2>&, const T1&)
void do_stuff(std::pair<T1, T2> const &pair, T1 const &val) {
^~~~~~~~
test.cc:5:6: note: template argument deduction/substitution failed:
test.cc:12:27: note: deduced conflicting types for parameter ‘const T1’ (‘const int’ and ‘int’)
do_stuff(*foo.begin(), 0);
^
Bu çakışmayı çözmenin en iyi yolu nedir? İdeal olarak T1
'un int
olarak çıkarılmasını isterim, ancak uygulamak daha kolaysa const int
olmasını isterim. eğer
void do_stuff(std::pair<T1, T2> const &pair, typename std::remove_const<T1>::type const &val) {
ama daha uygun olanların hangi bilmiyorum ya:
ben val
parametrenin türüne ya std::remove_const
veya std::decay
kullanarak hatayı gidermek olabileceğini saptadık Daha iyi olabilecek başka bir çözüm var.
anlamayacağınızdan emin değilsiniz ... neden buna göre do_stuff() 'i tanımlamıyorsunuz; 'Typename T1, typename T2> void do_stuff (std :: çifti const & çifti, T1 const & val) 'demek istedim? –
max66
@ max66, aynı zamanda ilk tip * * const * olmayan çiftlerle de çalışmasını istiyorum. (Tüm parametre const referansı tarafından geçirildiği için, çiftin üyelerinin sağlamlığı ilgisizdir; ya da bunlardan herhangi biri için const yapısına izin verilmelidir.) – Wyzard
Haritaya yapım yapmayı denediniz mi? Std :: map foo {{0, 0.0}}; ' –
mtb