Inicialization_list templada: por qué falla la búsqueda
-
27-10-2019 - |
Pregunta
Dado
#include <utility>
template <typename T1, typename T2, typename T3>
void foo(std::initializer_list<std::pair<T1, T2>> _a, std::initializer_list<T3> _b) {
/* ... */
}
int main() {
foo({{1,2},{3,4}},{1,2,3,4,5});
}
¿Por qué GCC 4.6 produce el error?
error: no matching function for call to ‘foo(<brace-enclosed initializer list>, <brace-enclosed initializer list>)'
note: candidate is
note: template<class T1, class T2, class T3> void foo(std::initializer_list<std::pair<T1, T2> >, std::initializer_list<T3>)
ActualizarAhora funciona cuando
template <typename T1, typename T2>
std::pair<T1, T2> p(const T1& _1, const T2& _2) {
return std::make_pair(_1, _2);
}
se agrega y {{1,2},{3,4}}
se reemplaza con {p(1,2), p(3,4)}
.
Solución
Lo que estás tratando de hacer es básicamente encadenado conversión/invocación, que no está permitida en C ++.
Primero quieres convertir esto,
{{1,2},{3,4}}
en esto (mientras deduce el escribe argumento),
{std::pair<int,int>{1,2},std::pair<int,int>{3,4}}
que luego en std::initializer_list
. No esta permitido.
Tienes que hacer una conversión tú mismo:
foo( {std::pair<int,int>{1,2},std::pair<int,int>{3,4}}, {1,2,3,4,5});
Entonces compilará: http://ideone.com/brjqv
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow