template parameters not used in partial specialization



  • Minimalbeispiel:

    template<class X>
    struct Test;
    
    template<class A, class B>
    struct Test2 { // Zeile 28
    
        template<class C>
        struct Test3 {
        };
    
    };
    
    template<class A, class B, class C>
    struct Test<typename Test2<A,B>::template Test3<C> > {
    
    };
    

    Fehlermeldung:
    test.cpp:28:8: error: template parameters not used in partial specialization:
    test.cpp:28:8: error: ‘A’
    test.cpp:28:8: error: ‘B’

    compiler:
    g++ (SUSE Linux) 4.5.0 20100604 [gcc-4_5-branch revision 160292]

    Ist das ein Compiler-spezifischer fehler? Ich glaube das mit äkteren Compilern schon übersetzt zu haben ...



  • LIPS schrieb:

    template<class A, class B, class C>
    struct Test<typename Test2<A,B>::template Test3<C> > {
    
    };
    

    typename Test2<A,B>::template Test3<C> ist kein "deduzibler Kontext" bzgl A und B. Das heißt, der Compiler kann aus dem Template-Parameter X nicht ableiten, was A und B sein soll.

    Lösen könnte man das, indem Du Test3 als Template mit 3 Parametern außerhalb von Test2 deklarierst:

    template<class A, class B, class C>
    struct Test3 {
    };
    
    template<class A, class B, class C>
    struct Test<Test3<A,B,C> > {
    };
    

Anmelden zum Antworten