2011-07-24 12 views
6

Czytam C++ Szablony Complete Guide i natknąłem się na to nie typ kodu parametrów szablonu funkcji (Dodałem main() i inne części, z wyjątkiem definicji funkcji i rozmowy):dla typu szablonu funkcja Parametry

#include <vector> 
#include <algorithm> 
#include <iostream> 

template <typename T, int value> 
T add (T const & element){ 
    return element + value; 
} 

int main() { 
    int a[] = {1,2,3,4}; 
    int length = sizeof (a)/sizeof (*a); 
    int b[length]; 
    std::transform (a, a + length, b, (int(*)(int const &))add <int, 5>); //why? 
    std::for_each (b, b + length, [](int const & value){ std::cout << value << '\n'; }); 
    return 0; 
} 

Po przeczytaniu książki nie zrozumiałem, dlaczego potrzebujemy typowania po wywołaniu funkcji?

EDIT: wyjaśnieniu z książki:

add to szablon funkcji i szablony funkcyjne są uważane wymienić zestaw przeciążonych funkcji (nawet jeśli zestaw ma tylko jeden element). Jednakże, zgodnie z aktualnym standardem, zestawy przeciążonych funkcji nie mogą być użyte do dedukcji parametrów szablonu. W ten sposób, masz do oddania do dokładnego typu argumentu szablonu funkcję: ...

Compiler: g ++ 4.5.1 na Ubuntu 10.10

Odpowiedz

6

Ściśle mówiąc, nie można odwołać się do specjalizacji szablon funkcji po prostu dając listę argumentów szablonu. Zawsze musiałeś mieć typ celu (np. Typ parametru funkcji, do którego się podajesz lub typ rzucania, lub typ zmiennej, któremu przypisujesz).

To był przypadek, nawet jeśli typ docelowy jest całkowicie wolny od parametrów szablonu, na przykład

template<typename T> void f() { } 
template<typename T> void g(T) { } 

int main() { 
    g(f<int>); // not strictly valid in C++03 
    g((void(*)())f<int>); // valid in C++03 
} 

Komitet added rules, które zostały przyjęte w C++ 0x i przez popularne kompilatory C++ w ich 03 tryb, który umożliwił pominięcie typu celu, jeśli podasz kompletną listę argumentów dla szablonu dostarczającą typy dla wszystkich parametrów szablonu, wraz z wszystkimi domyślnymi argumentami szablonu.

Powiązane problemy