Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Template-Spezi innerhalb Template-Klasse? Warum gehts nicht?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.12.2009, 22:56 Uhr
~Fragender
Gast


Hallo,

folgendes Minimalbeispiel geht einfach nicht:


C++:
#include <iostream>

template <class T>
class foo
{
        public:
                void bar();
                void myfunction(int& a);
                void myfunction(double& a);
};


template <class T>
void foo<T>::bar()
{
        T var;
        std::cout << "bar()";
        myfunction(var);
}



//foo.cpp

C++:
// die foo.cpp
#include "foo.h"

template<>
void foo<int>::myfunction(int& a)
{
        std::cout << "myfunction int";
}
template<>
void foo<double>::myfunction(double& a)
{
        std::cout << "myfunction double";
}



//main.cpp


C++:

#include "foo.h"

// die main

int main(int argc, char** argv)
{
        foo<double> fd;
        fd.bar();

        return 0;
}


kann ich denn keine template-spezialisierung innerhalb einer template-klasse machen?

danke
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.12.2009, 22:58 Uhr
~Fragender
Gast


argh - die fehlermeldung die ich posten wollte ist:


Code:
tmp/cc25BrVv.o: In function `foo<double>::bar()':
main.cpp:(.text._ZN3fooIdE3barEv[foo<double>::bar()]+0x28): undefined reference to `foo<double>::myfunction(double&)'
collect2: ld gab 1 als Ende-Status zurück


 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.12.2009, 23:40 Uhr
0xdeadbeef
Gott
(Operator)


Ich nehme an, du meintest

C++:
template <class T>
class foo
{
        public:
                void bar();
                void myfunction(T& a);
};


, aber ich kann den Fehler auch in der ursprünglichen Version nicht nachvollziehen. Vergessen, foo.cpp mit einzukompilieren?
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
09.12.2009, 11:01 Uhr
~Fragender
Gast


ja richtig - foo.cpp vergessen einzubinden.

Dennoch hätte ich noch eine frage die mein problem beschreibt.
Mir ist bei untigem code irgendwie klar dass ich zwar einen double foo typen haben und es halt
keine spezialisierung frü fooy<int> gibt.

Doch wie kann ich innerhalb eine template-funktion abhängig vom Template-Typen in Template-spezialisierungen unterschiedlicher signatur springen? Muss ich wirklich für alle typen identische signatur-templates zur verfügung stellen die dann leer sind? so dummy template-spezialisierungen?



C++:
#include "foo.h"

// die main

int main(int argc, char** argv)
{
        foo<double> fd;
        fd.bar();

        return 0;
}




C++:
#include <iostream>

template <class T>
class foo
{
        public:
                void bar();
                void myfunction(int& a, int& b);
                void myfunction(double& a);
};


template <class T>
void foo<T>::bar()
{
        double var;
        std::cout << "bar()";
        myfunction(var);
}




C++:
// die foo.cpp
#include "foo.h"

template<>
void foo<int>::myfunction(int& a)
{
        std::cout << "myfunction int";
}
template<>
void foo<double>::myfunction(double& a)
{
        std::cout << "myfunction double";
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.12.2009, 13:51 Uhr
0xdeadbeef
Gott
(Operator)


Zunächst mal: Es handelt sich hier nicht um eine Template-Funktion, sondern um eine Funktionsvorlage (template = Vorlage). Eine Funktionsvorlage ist keine Funktion, genau so wenig, wie eine Klassenvorlage eine Klasse ist.

Was deinen speziellen Fall angeht, ich vermute, dass du folgendes meinst:

C++:
#ifndef INCLUDED_FOO_H
#define INCLUDED_FOO_H


#include <iostream>

template <class T>
class foo
{
        public:
                void bar();
                void myfunction(T &a);
};


template <class T>
void foo<T>::bar()
{
        T var;
        std::cout << "bar()";
        myfunction(var);
}

#endif


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.12.2009, 20:55 Uhr
~Prog
Gast


Wenn du mit Templates arbeitest dann schreib alles in die Headerdatei, cpp's sind hier nicht sinnvoll. Wenn du umbedingt ne Aufspaltung in 2 Dateien machen willst, dann binde die cpp am Ende der Headerdatei ein, (direkt vor dem #endif).

Dein kompletter Code wird wahrscheinlich ungefähr so aussehen:


C++:
#ifndef INCLUDED_FOO_H
#define INCLUDED_FOO_H

#include <iostream>

template <class T>
class foo
{
    public:
        void bar();
        void myfunction(T &a);
};

// Implementierungsteil

template <class T>
void foo<T>::bar()
{
    T var;
    std::cout << "bar()";
    myfunction(var);
}

template<>
void foo<int>::myfunction(int& a)
{
    std::cout << "myfunction int";
}

template<>
void foo<double>::myfunction(double& a)
{
    std::cout << "myfunction double";
}

#endif



Jetzt kannst du aber nur foo's für in int oder double generieren, weil für alle anderen die Memberfunktion myfunction nicht definiert ist. Wenn du ne allgemeine Funktion definieren willst sieht das ungefähr so aus:


C++:

template<class T>
void foo<T>::myfunction(T& a)
{
    std::cout << "myfunction für alle nicht int und double";
    T variable; // Deklaration einer Variable vom Typ T
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.12.2009, 21:22 Uhr
0xdeadbeef
Gott
(Operator)


Das ist bei vollständigen Spezialisierungen nicht notwendig.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: