Error: Teilspezialisierung des Funktionstemplates ist nicht erlaubt



  • Hallo
    ich wollte mich ein bisschen mit Metaprogrammierung beschäftigen und wollte nun eine Schleife machen, die mir Zuweisungen macht.
    Also wenn ich zwei int-arrays habe der selben Länge N wollte ich mit

    meta_assign<int, length>(array1, array2)
    

    den zweiten array in den ersten kopieren.
    Dazu habe ich nun geschrieben:

    template<class T, int N>
    inline void meta_assign(T* a, T* b)
    {
        meta_assign<T,N-1>(a,b);
        a[N] = b[N];
    }
    
    template<class T>
    inline void meta_assign<T,0>(T* a, T* b) //<- HIER IST DER FEHLER
    {
        a[0] = b[0];
    }
    

    Jetzt wirft mir aber der Kompiler folgende Fehlermeldung aus:

    /home/tstorch/Source/codeblocks/Test/test.hpp|12|Fehler: Teilspezialisierung »meta_assign<T, 0>« des Funktionstemplates ist nicht erlaubt|
    

    Ich habe jetzt keine Ahung, was ich falsch gemacht habe. Wäre nett wenn mir da einer ein bisschen auf die Sprünge helfen könnte.

    mfg
    MamboKurt



  • E0173: The C++ database found no answer to your question. Please try again later.



  • Steht doch da auf ganz klarem Deutsch.. Teilspezialisierung von Funktionstemplates sind nicht erlaubt..



  • ok

    ich hab das jetzt mit klassen-templates gemacht. jetzt hab ich aber noch eine andere frage.

    ich will eine template-matrix-klasse schreiben. also mit template<int N>, wobei N die dimension ist. die matrix soll dann N^2 einträge habe. gibt es eine möglich keit beim konstruktor die initialisierung der einträge aus dem rumpf raus zu holen.

    im momen siehts so aus:

    template<int N, class T>
    class meta_assign{
    private:
        enum { go = (N-1) != 0 };
    
    public:
        static inline void f(T* a, T* b)
        {
             meta_assign<go ? (N-1) : 0,T>::f(a,b);
             a[N] = b[N];
        }
    };
    
    template<class T>
    class meta_assign<0,T>{
    public:
        static inline void f(T* a, T* b)
        {
            a[0] = b[0];
        }
    };
    
    template<class T,int N>
    class Matrix
    {
        private:
            int dimension;
            T entries[N][N];
    
        public:
    
            Matrix(T* entries)
            : dimension(N)
            {
                meta_assign<N*N-1, T>::f(*this->entries, entries);
            }
    };
    

    ich möchte aber, dass ich entries genau wie dimension noch vor dem rumpf initialisiere.

    mfg
    MamboKurt


Anmelden zum Antworten