Tiré de cppreference, pourquoi l'appel à std::apply(add_generic, ...)
ne parvient pas à compiler? Y a-t-il un moyen de le réparer?Pourquoi std :: apply échoue avec une fonction générique?
#include <iostream>
#include <tuple>
int add(int first, int second)
{
return first + second;
}
template<typename T>
T add_generic(T first, T second)
{
return first + second;
}
int main()
{
std::cout << std::apply(add, std::make_tuple(1,2)) << '\n';
// template argument deduction/substitution fails
std::cout << std::apply(add_generic, std::make_tuple(2.0f,3.0f)) << '\n';
}
Il fails avec l'erreur:
[x86-64 gcc 7 (snapshot)] error: no matching function for call to 'apply(, std::tuple)' [x86-64 gcc 7 (snapshot)] note: couldn't deduce template parameter '_Fn'
Sans voir les erreurs éventuelles, je suppose qu'il est possible être en raison de ne pas être capable de déduire correctement le type d'argument 'T'? –
Comment compilez-vous le code? 'std :: apply' nécessite' C++ 17', votre compilateur a-t-il le support 'C++ 17'? – Rogus
'add_generic' n'est pas une fonction, c'est un template. Vous ne pouvez pas déduire un type de quelque chose qui n'a pas de type. – chris