Próbowałem skompilować projekt (który jest w porządku przy użyciu gcc/g ++) z klang i kompilacji zatrzymanych na szablonie wywołania. Próbowałem utworzyć najprostszy podobny fragment kodu z tym samym komunikatem o błędzie. Oto ona:Clang "nie może wywnioskować argumentu szablonu", podczas gdy gcc/g ++ może. Który jest poprawny?
#include <vector>
#include <utility>
#include <iostream>
using namespace std;
int A(double in)
{
return 1;
}
int A(int in)
{
return 1;
}
template<class M, class T>
M test(T input, M (fun) (T))
{
return fun(input);
}
int main(int argc, const char *argv[])
{
cout << test((int) 1, A) << test((double) 1.2, A) << endl;
return 0;
}
Błąd z brzękiem (pojawia się dwa razy oczywiście):
error: no matching function for call to 'test'
candidate template ignored: couldn't infer template argument 'M'
GCC nie narzekać. Uwaga: M jest typem zwrotnym i zawsze jest "int".
Czy ktoś wie, co jest poprawne i dlaczego?
Dzięki
czy zamiast tego spróbowałeś użyć testu (..., & A)? –
Stefano: Próbowałem, to nie miało znaczenia. – Max
I nie powinno. Nie ma potrzeby używania operatora adresu dla nazwy funkcji, aby uzyskać wskaźnik funkcji. (I podobnie, nie ma potrzeby jawnego dereferencji wskaźnika funkcji za pomocą '*', aby go wywołać.) Chociaż możesz, jeśli naprawdę chcesz, ale to nie ma znaczenia. – BoBTFish