2012-06-27 23 views
8

mam ten kod:Domyślne parametry szablonu: Dlaczego kompilator narzeka na brak określenia argumentu szablonu?

struct A{}; 

template<class T = A> 
struct B { 
    void foo() {} 
}; 

B b; //Error: missing template arguments before 'b' 
    //Error: expected ';' before 'b' 
    //More errors 
b.foo() 

Jeśli zrobię foo() jako funkcję szablonu z tego samego szablonu „podpis”, kompilator nie narzekają, nie podając argumentów szablonu:

struct A {}; 

struct B { 
    template<class T = A> 
    void foo() {} 
}; 

B b; //OK 
b.foo() 

Dlaczego więc muszę określić argument dla klasy szablonu z parametrem domyślnym, ale nie dla funkcji szablonu? Czy brakuje mi jakiejś subtelności?

Przyczyna jest spowodowana niewystarczającym odrzuceniem argumentu szablonu. Ale chcę wiedzieć dlaczego.

+0

Czy brakuje tytułu z tytułu tego pytania? – Pointy

+0

Tak. Brakowało słowa - narzekać. Dodano. – badmaash

+0

Prawdopodobny duplikat * [Domyślne szablony szablonów funkcji] (http://stackoverflow.com/questions/2447458/default-template-arguments-for-function-templates) *. –

Odpowiedz

7

Poprawna składnia jest to (demo):

B<> b; 

Domyślnym argumentem A zakłada się dla klasy szablonu B. Część <> mówi kompilatorowi, że B jest szablonem klasy i prosi go o przyjęcie parametru domyślnego jako argumentu szablonu.

+0

Rozumiem. Ale dlaczego funkcja szablonu działa bez tego: 'b.foo <>()'? – badmaash

+1

@badmaash: To nie działa: http://ideone.com/QhWgJ – Nawaz

+0

Moja zła. Powinien wspomnieć o g ++ 4.7.0, który obsługuje domyślne parametry szablonów dla funkcji. Tak więc powyższy kod na pewno działa. Spróbuj uruchomić z g ++ 4.7.0. – badmaash

0

Bo trzeba powiedzieć, że B jest szablonem:

B<> b; 

Nawet wtedy, gdy nie chcesz, aby określić dowolny z argumentów.

+0

Właściwie potrzebujesz '<>', aby powiedzieć kompilatorowi, że nie chcesz szablonu, ale instancję szablonu z domyślnym argumentem. Składnia jest jednak poprawna. –

1

Poprawna składnia, jak Nawaz wspomina już jest:

B<> b; 

Powodem jest to, że B jest szablon i B<> jest konkretyzacji szablonu z domyślnym argumentem A. Ale potrzebujesz <>, aby rozróżnić, kiedy chcesz utworzyć instancję.