La versione del modello viene utilizzata dal compilatore per calcolare t = max(a, b)
e max(t, c)
. Qualunque citazione dallo Standard a sostegno di questo è la benvenuta.Perché la versione del modello viene scelta di seguito dal compilatore?
#include <iostream>
template <typename T>
inline T const& max (T const& a, T const& b)
{
std::cout << "template" << '\n';
return a < b ? b : a;
}
template <typename T>
inline T const& max (T const& a, T const& b, T const& c)
{
return max (max(a,b), c);
}
inline int const& max (int const& a, int const& b)
{
std::cout << "non-template" << '\n';
return a <b ? b : a;
}
int main()
{
std::cout << max(3, 5, 7) << '\n';
}
template
template
7
Provate avanti dichiarando 'int const & max (int const & a, int const & b)' prima del vostro argomento di 3 argomenti 'max'? – Yakk
@Yakk So che questo risolverà il problema. Ma voglio sapere perché è questo? – Alexander
I sovraccarichi dopo il punto della definizione di 'template' vengono trovati solo tramite ADL dallo standard. 'int' non è un tipo definito dall'utente, quindi la tua ADL non funziona (non so come funziona ADL di tipo non definito dall'utente se funziona, onestamente). Alcuni compilatori ** cough ** visual studio ** cough ** non lo fanno correttamente (non sono sicuro del 2013). – Yakk