2013-02-11 14 views
5

mam problem z kawałkiem kodu następującej postaci:Zaproszenie do funkcji składowej szablon braku skompilować

template<class Type> 
class Class1 { 
public: 
    template<class TypeName1> TypeName1* method1() const {return 0;} 
}; 

struct Type1{}; 
struct Type2{}; 

class Class2 { 
public: 
    template<typename TypeName1, typename TypeName2> 
    int method2() { 
     Class1<TypeName2> c; 
     c.method1<TypeName1>(); 
     return 0; 
    } 

    int method1() { 
     return method2<Type1, Type2>(); 
    } 
}; 

int 
main() { 
    Class2 c; 
    return c.method1(); 
} 

Kiedy skompilowany z kompilatora w codepad:

http://codepad.org/ZR1Std4k

otrzymuję następujący błąd:

t.cpp: In member function 'int Class2::method2()': Line 15: error: expected primary-expression before '>' token compilation terminated due to -Wfatal-errors.

linia wykraczająca jest wywołanie funkcja członek szablon:

c.method1<TypeName1>(); 

Odpowiedz

11

Należy użyć template słowa kluczowego, gdy jesteś powołując szablon funkcji członka i masz nazwę zależną lub method1 będzie analizowany jako zmienna członkowskim c i < jako „mniej niż”symbol:

c.template method1<TypeName1>(); 

Jak @DrewDormann słusznie zauważa, dlatego wymagana jest kluczowe template jest to, że specjalizacja szablonu Class1 klasy może istnieć dla danego typu argumentu pod warunkiem, gdzie method1 jest zdefiniowany jako zmienna składowa, a nie szablon funkcji. W związku z tym kompilator musi zostać jawnie poinstruowany, aby parsować method1 jako nazwę szablonu funkcji, jeśli tak nie jest.

+0

Dobra odpowiedź. Okropny język. –

+0

Pracował jak urok, zaakceptuje za 5 minut! –

+2

+1. Szczególnie w tym kontekście, nawet jeśli "Class1" jest zadeklarowane jako forward, nie można założyć, że 'Class1 :: method1' jest funkcją szablonu. Specjalizacja szablonu "Class1" w innym miejscu może udowodnić, że jest inaczej. –

Powiązane problemy