2014-12-22 18 views
12

W moim kodu C++, pisałem tak:Domyślny parametr C++ w szablonie jest niedozwolony?

template <typename T, typename Pred> 
inline const T BestOfTwo(const T& lhs, const T& rhs, Pred p = std::less<T>()) 
{ 
    return p(lhs, rhs) ? lhs : rhs; 
} 

Ale to nie działa, gdy zadzwoniłem BestOfTwo (3, 5). Kompilator powiedział mi, że żadne wystąpienie przeciążenia nie pasuje. Więc teraz muszę napisać to tak:

template <typename T, typename Pred = std::less<T> > 
inline const T BestOfTwo(const T& lhs, const T& rhs, Pred p = Pred()) 
{ 
    return p(lhs, rhs) ? lhs : rhs; 
} 

I to działało bez błędu, gdy zadzwoniłem BestOfTwo (3, 5). Ale myślę, że poprzedni styl jest wygodniejszy i nie wiedziałem, gdzie poszło nie tak. Jakie są sugestie?

+0

Prawdopodobny duplikat * [Wartość domyślna funkcji szablonu C++] (http://stackoverflow.com/questions/3301362/c-template-function-default-value) *. –

Odpowiedz

12

Tylko druga wersja jest poprawna (jeśli nie chcesz ręcznie określać parametru Pred), ale tylko od C++ 11. Istnieje już odpowiedź od Angew, która wyjaśnia, dlaczego pierwsza wersja jest niepoprawna, bez specyfikacji parametru Pred.

Jeśli nie możesz użyć C++ 11, powinieneś napisać dwa przeciążenia (jeden z Pred i jeden bez, który używa std::less), ponieważ domyślne parametry szablonu dla szablonów funkcji są jawnie zabronione w C++ 98.

template<typename T, typename Pred> 
inline const T BestOfTwo(const T& lhs, const T& rhs, Pred p = Pred()) 
{ 
    // 
} 

template<typename T> 
inline const T BestOfTwo(const T& lhs, const T& rhs) 
{ 
    return BestOfTwo<T, std::less<T> >(lhs, rhs); 
} 
10

Pierwsza wersja będzie działać, jeśli podano argumenty szablonu wyraźnie:

BestOfTwo<int, std::less<int>>(3, 5) 

Powodem jest to, że argumenty domyślne funkcja nie może być używana do wywnioskować typ dla parametru szablonu.

Powiązane problemy