2012-10-01 16 views
23

Powiel możliwe:
C++ template member function of template class called from template functionJak wywołać funkcję członka szablonu?

template<class T1> 
class A 
{ 
public: 
    template<class T0> 
    void foo() const {} 
}; 

template<class T0,class T1> 
void bar(const A<T1>& b) 
{ 
    b.foo<T0>(); // This throws " expected primary-expression before ‘>’ token" 
} 

mogę go zmienić na

b->A<T1>::template foo<T0>(); 

który kompiluje grzywny. Jednak można również zmienić go na

który również kompiluje dobrze. co?

Jak poprawnie wywołać funkcję elementu szablonu w znaczeniu oryginalnego kodu?

+0

Czy wiemy, co te dwa stwierdzenia, które faktycznie skompilować oznacza? W tym "ugotowanym" przykładzie kompilują, ale w moim prawdziwym programie to się nie kompiluje. – ritter

Odpowiedz

37

Wystarczy znaleźć go:

Według C++ '03 Standardu 14,2/4:

Gdy pojawi się nazwa specjalizacji szablonu członek po . lub -> w postfix ekspresji lub po specyfikator-nazwy-zagnieżdżonej w kwalifikowanym-id, a wyrażenie przyrostkowe lub kwalifikowany-identyfikator jawnie zależy od parametru-szablonu (14.6.2), nazwa szablonu elementu członkowskiego musi być poprzedzona prefiksem słowa kluczowego template. W przeciwnym razie przyjmuje się, że nazwa nie jest szablonem.

Prawidłowy kod jest:

b.template foo<T0>(); 
+1

I robi się to z tego samego powodu i w warunkach podobnych do tego, kiedy 'nazwa_pliku' jest konieczna. – bames53

10

można wywołać funkcję w ten sposób:

b.template foo<T0>(); 
Powiązane problemy