Einzelne Template Methode in nicht Template Klasse



  • Hallo zusammen
    Ich wollte mich einmal erkundigen, ob es möglich ist, eine einzelne Templatemethode in einer Nicht Template Klasse zu implementieren?

    So etwas in dieser Art:

    // ********************************** class "ResourceService" *********************************
    // This class handles the entire resource management of this application. This ResourceService
    // is capable of loading from any imaginable datasource like local files, nfs, http, ftp,
    // soap, any kind databases etc. by adequate ResourceReaders. In the same manner, this
    // ResourceService is capable of decoding any imaginable audio, video and image data by
    // adequate ResourceDecoders, thus every imaginable datasource can be combined with any
    // imaginable binary or non-binary data. Every resource can either be loaded synchronous or
    // asynchronous and even be streamed if required. Furthermore this ResourceService can handle
    // procedural resources which are being generated by mathematical functions at runtime.
    // Last but not least this ResourceService is capable of sharing resources between multiple
    // instances which need the same or part of the same resources at the same time and does
    // tranparently decide when to load and unload which resource using reference counting and
    // foreseeing heuristics.
    // Be aware that a resource reader is a statefull object and thus cannot be shared between
    // multiple resources, while the resource decoders are stateless and can easily be shared.
    // While the ResourceReaderFactory is organized by a chain of responsibility, this comfortable
    // approach would be far too slow for the ResourceDecoders in coherence with the streaming
    // capability and is therefore organzied by a balanced binary search tree instead.
    // Author: Samuel Lörtscher
    // ********************************************************************************************
    class ResourceService:public Service{
     private:
     // --------------------------------- private dynamic members ---------------------------------
     Dictionary<string*,Resource*>        *dcRsc; // a dictionary containing all resources
     List<string*,ResourceReaderFactory*> *lsRdr; // a list containing all reader factories
     Dictionary<string*,ResourceDecoder*> *dcDec; // a dictionary containing all resource decoders
     VideoService                         *svVdo; // required for accessing video memory
     AudioService                         *svAud; // required for accessing audio memory
     InputService                         *svInp; // required for accessing haptic devices
     // -------------------------------------------------------------------------------------------
    public:
     // ---------------------------- custom constructor and destructor ----------------------------
     ResourceService(HInstance Instance,HWindow Window);
     ~ResourceService(void);
     // -------------------------------------------------------------------------------------------
    
     // ---------------------------------- public dynamic methods ---------------------------------
     void RegisterReaderFactory(ResourceReaderFactory *Factory);
     void UnregisterReaderFactory(ResourceReaderFactory *Factory);
     void RegisterDecoder(string *TypID,ResourceDecoder *Decoder);
     void UnregisterDecoder(string *TypID);
     void RegisterResource(string *ID,Resource *Resource);
     void UnregisterResource(string *ID);
    
     template<class T> T *GetResource<class T>(string *ID); // Diese methode möchte ich als template?
     // -------------------------------------------------------------------------------------------
    };
    // ############################################################################################
    

    Mfg Samuel



  • template<class T> T *GetResource(string *ID);
    


  • @drakon
    Hehe, ja das dachte ich zuerst auch, aber das kompiliert eben auch nicht. Hab jetzt so ziemlich jede Variation durchprobiert...

    Ich benutze Visual Studio 2008 Professional

    P.S.
    An die C++ Templates werde ich mich wohl nie gewöhnen...



  • Ishildur schrieb:

    @drakon
    Hehe, ja das dachte ich zuerst auch, aber das kompiliert eben auch nicht.

    Dann ist was anderes falsch. Ich frag jetzt mal nicht nach der Fehlermeldung *Zaunpfähle werf*... 🙄



  • @pumuckl
    Jaaa die Fehlermeldungen von Visual Studio bei C++ Templatefehlern...
    Glaube mir, du willst nicht, dass ich die hier poste, sind ca. 800 Zeilen Fehlermeldungen. Nehme ich diese Zeile raus, kompilierts und linkts. Aber ich bin schonmal sehr froh, dass ich nun sicher sein kann, dass es nicht an der Templatemethodendeklaration liegt, dies schränkt die Fehlersuche bereits wesentlich ein 🙂



  • Ishildur schrieb:

    @pumuckl
    Jaaa die Fehlermeldungen von Visual Studio bei C++ Templatefehlern...
    Glaube mir, du willst nicht, dass ich die hier poste, sind ca. 800 Zeilen Fehlermeldungen. Nehme ich diese Zeile raus, kompilierts und linkts. Aber ich bin schonmal sehr froh, dass ich nun sicher sein kann, dass es nicht an der Templatemethodendeklaration liegt, dies schränkt die Fehlersuche bereits wesentlich ein 🙂

    Die ersten 20-40 Zeilen wären schonmal was. wenn du ne leere Methode draus machst.



  • drakon schrieb:

    template<class T> T *GetResource(string *ID);
    

    seit wann kann man in C++ fkt nur an hand des rückgabetypen überladen?

    bb



  • unskilled schrieb:

    drakon schrieb:

    template<class T> T *GetResource(string *ID);
    

    seit wann kann man in C++ fkt nur an hand des rückgabetypen überladen?

    bb

    Wer sagt denn hier etwas von überladen?! (Bitte sag nicht der riesen Kommentar dort oben im Code, denn den habe ich nicht gelesen. ;))

    @Ishildur:
    Das hier funktioniert wunderbar:

    #include <iostream>
    struct foo
    {
     template<class T> void bar ()
     {
       std::cout << "foo::bar"; 
     }
    };
    
    int main() 
    {
     foo f;
     f.bar<int> ();
    }
    

    Der Fehler liegt wo anderst.



  • @unskilled
    Ja anhand des Templateparamters sollte der Compiler das eben doch wieder unterscheinen können. Ich möchte auf die Resourcen dann eifach folgendermassen zugreifen können:

    Sound   *snd = svRsc->GetResource<Sound*>("Smash2");
     Texture *tex = svRsc->GetResource<Texture*>("Gunship");
    

    Anstatt:

    Sound   *snd = dynamic_cast<Sound*>(svRsc->GetResource("Smash2"));
     Texture *tex = dynamic_cast<Texture*>(svRsc->GetResource("Gunship"));
    


  • drakon schrieb:

    unskilled schrieb:

    drakon schrieb:

    template<class T> T *GetResource(string *ID);
    

    seit wann kann man in C++ fkt nur an hand des rückgabetypen überladen?

    bb

    Wer sagt denn hier etwas von überladen?! (Bitte sag nicht der riesen Kommentar dort oben im Code, denn den habe ich nicht gelesen. ;))

    oh - war einfach nur nen unüberlegter post - hab da was durcheinander gebracht gehabt^^
    (ich auch nicht 🙂 )

    @I.:
    wo liegt denn nun dein problem?
    du kannst die templates so gar spezialisieren:

    #include <iostream>
    
    struct foo
    {
    	template<class T> T bar ()
    	{
    		std::cout << "foo::bar<T>";
    		return T();
    	}
    
    	template<>
    	int bar()
    	{
    		std::cout << "foo::bar<int>";
    		return int();
    	}
    
    	template<>
    	float bar()
    	{
    		std::cout << "foo::bar<float";
    		return float();
    	}
    };
    
    int main()
    {
    	foo f;
    	int x = f.bar<int> ();
    	float y = f.bar<float> ();
    }
    

    um mal drakons bsp. zu erweitern...

    bb



  • Das Rätsel hat sich aufgeklärt:
    Build -> Clean Solution
    Build -> Rebuild Solution

    Die Welt könnte so schön sein... :p



  • unskilled schrieb:

    du kannst die templates so gar spezialisieren:

    Hmm.. Wie gar sind denn die templates? :p

    Musste echt 2x lesen, bis ich wusste, was du da meinst. Dachte zuerst, dass du "so gar nicht" schreiben wolltest. 😉

    @Ishildur
    Ja.. Das hilft bei mehr Problemen, als man wagen zu denken möchte. 😉

    //Edit:
    Um das mit dem Rebuild noch zu unterstreichen:
    http://www.drakon.ch/?id=&offset=5&mobile=0&show_entry=68
    Du bist also mit solchen Phänomenen nicht alleine. 😉



  • So weit ich weiss kann man Methoden nicht spezialisieren.

    Edit: Gemeint sind natürlich templated member



  • DocShoe schrieb:

    So weit ich weiss kann man Methoden nicht spezialisieren.

    Aber überladen.



  • drakon schrieb:

    Um das mit dem Rebuild noch zu unterstreichen:
    http://www.drakon.ch/?id=&offset=5&mobile=0&show_entry=68
    Du bist also mit solchen Phänomenen nicht alleine. 😉

    Mein Kommentar zu dem Blogpost:

    VC scheint nicht immer mitzukriegen, wenn sich Header ändern, vor allem wenn diese nur indirekt eingebunden werden, sich in anderen Projekten befinden, für die in der Solution keine Abhängigkeiten angegeben sind usw.
    Das Ergebnis sind in diesem Fall Objektdateien und libs mit verschiedenen Größeninformationen für die selbe Klasse, und das geht dann irgendwo schief, weil der Teil mit der größeren Foo ein foo bearbeitet, für das der Teil mit dem kleineren Foo Speicher bereitgestellt hat (auf dem Stack oder Heap ist dabei egal) und über diesen reservierten Speicher rausschreibt.

    Da hier immer noch nicht die Fehlermeldungen gepostet wurden kann man auch nicht genau sagen obs was in der Richtugn gewesen ist...



  • Ishildur schrieb:

    @pumuckl
    Jaaa die Fehlermeldungen von Visual Studio bei C++ Templatefehlern...
    Glaube mir, du willst nicht, dass ich die hier poste, sind ca. 800 Zeilen Fehlermeldungen.

    Dazu fällt mir folgendes ein:

    Dravere schrieb:

    1. Wieso gebt ihr uns nie die Fehlermeldungen? Für uns sind die nicht kryptisch, wir können die lesen und sie helfen uns.

    Im Ernst: Template-Fehlermeldungen sind weit übersichtlicher als ihr Ruf, mit etwas Übung kann man die wichtigen Details schnell herauslesen. Natürlich musst du auch nicht die 790 Zeilen Folgefehler anschauen. Und ein Klick auf die Fehlermeldung hilft auch schon in vielen Fällen.

    Das Posten der Fehlermeldung hat den netten Nebeneffekt, dass sich keine Diskussion über die Art der Fragestellung bildet. Einfach ein Rat für zukünftige Probleme... 😉



  • pumuckl schrieb:

    Da hier immer noch nicht die Fehlermeldungen gepostet wurden kann man auch nicht genau sagen obs was in der Richtugn gewesen ist...

    Das stimmt allerdings.

    btw:
    Du hast am falschen Ort gepostet. 😉 - Ich habe den Kommentar an den richtigen Ort verschoben.


Anmelden zum Antworten