Il seguente codice non riesce a compilare a causa di error: redefinition of ‘template<class Integer, class> void func(Integer)’
Perché questa funzione non può essere sovraccaricata con una firma chiaramente diversa?
#include <iostream>
#include <type_traits>
template<typename Float, typename = typename
std::enable_if<std::is_floating_point<Float>::value>::type>
void func(Float floatVal)
{
std::cerr << "float: " << floatVal << "\n";
}
template<typename Integer, typename = typename
std::enable_if<std::is_integral<Integer>::value>::type>
void func(Integer integer)
{
std::cerr << "integral: " << integer << "\n";
}
int main()
{
func(32.4246);
func(144532);
}
Ma le due funzioni saranno chiaramente avere diverse firme sul modello di istanza. Quindi, perché non è possibile compilare questo?
Si prega di notare: Io faccio sapere come risolvere questo problema: semplicemente aggiungendo un altro parametro modello fittizio per una delle funzioni, per esempio typename=void
, lavorerà, come qui
template<typename Integer, typename dummy=void, typename = typename
std::enable_if<std::is_integral<Integer>::value>::type>
void func(Integer integer){}
Ma la domanda è il motivo per cui devo fare questo?
il problema è che si sta impostando per default il tipo di modello per il secondo modello arg. – AndyG
Non è possibile fornire un altro parametro di default del modello ad altre dichiarazioni nello stesso ambito. – edmz