Speicher für unbekannte Template-Klasse



  • Hi,
    ich habe folgenden Code:

    template <class type> class DynamicArray;
    
    typedef DynamicArray<class type>* LP_DYNAMIC_ARRAY;
    
    //...
    
    int Main::CreateDynamicArrayInterface(LP_DYNAMIC_ARRAY<class type>*ppDynamicArray)
    {
        //Speicher für die Array-Klasse bereitstellen
        *ppDynamicArray = new DynamicArray<type>;
        if(!(ppDynamicArray))
        {
            //Nicht genügend Speicher vorhanden
            return OUT_OF_MEMORY;
        }
    
        return OK;
    }
    

    Wie ihr seht, möchte ich Speicher für die Klasse in der Funktion bereitstellen. Der angeforderte Typ soll über 'type' an 'new' weitergeleitet werden, doch die Funktion wird so nicht angenommen, weil nicht ein 'DynamicArray', sondern ein 'DynamicArray*' (durch typedef) übergeben wird.
    Was kann ich tun, dass die Funktion korrekt arbeitet?

    BTW: Es ist wichtig, dass der Typ 'LP_DYNAMIC_ARRAY' bleibt und nicht 'DynamicArray' übergeben wird.

    Danke im Voraus

    M.T.



  • Original erstellt von Manuel:
    **Wie ihr seht, möchte ich Speicher für die Klasse in der Funktion bereitstellen.
    **

    und so wie ich das sehe, möchtest Du eine Instanz erstellen...

    **
    Der angeforderte Typ soll über 'type' an 'new' weitergeleitet werden, ...
    **

    Ich nehme an, dass 'type' bei Dir ein konkreter Typ sein soll, z.B. 'int'. Denn eine Instanz von einer Templateklasse, ohne das Templateargument konkret anzugeben, kann man natürlich nicht erzeugen.

    **
    ...doch die Funktion wird so nicht angenommen, weil nicht ein 'DynamicArray', sondern ein 'DynamicArray*' (durch typedef) übergeben wird.
    **

    Ich sehe das eher so, dass ein 'DynamicArray**' übergeben wird.

    Vielleicht hat Dir das schon geholfen... 😕



  • Hallo,
    irgendwie ist an dem Code nichts richtig.

    template <class type> class DynamicArray;

    Wir merken uns: Eine Templateklasse DynamicArray wurde *deklariert*. Bisher haben wir nur einen unvollständigen Typ

    typedef DynamicArray<class type>* LP_DYNAMIC_ARRAY;

    Das macht nicht, was man meinen könnte. LP_DYNAMIC_ARRAY ist *kein* alias für eine noch mit einem Typ zu spezifizierende Templateklasse.
    Vielmehr ist LP_DYNAMIC_ARRAY ein alias für die Templateklasse DynamicArray dessen Templateparameter mit dem *unvollständigen* Type type belegt ist.
    <class type> ist in diesem Fall eine forward-declaration einer Klasse type.

    LP_DYNAMIC_ARRAY<class type>

    Fehler! LP_DYNAMIC_ARRAY darf keine Templateparameterliste haben, da es sich nicht um eine Templateklasse handelt.

    *ppDynamicArray = new DynamicArray<type>;

    Doppelter Fehler. Weder DynamicArray nocht type sind vollständige Typen. Eine new-Expression erwartet aber einen vollständigen Typ. Und ich tippe einfachmal, dass DynamicArray später auch einen vollständigen Typen benötigt.



  • OK, das mit dem '**' statt '*' hab ich nur übersehen - hat aber nix mit der Lösung zu tun.

    Das mit dem Weglassen von ... beim typedef hatte ich mir schon fast gedacht, nur dann bringt der Compiler: 'DynamicArray' : Fuer die Verwendung einer Vorlagenklasse ist eine Vorlagen-Argumentliste erforderlich.

    Ich suche aber immer noch eine konkrete Lösung ...

    M.T.

    [ Dieser Beitrag wurde am 04.04.2003 um 16:53 Uhr von Manuel editiert. ]



  • example

    HRESULT CCeoImportBpc::Construct( IDispatch *pDispatch )
    {
     CComPtr<IObjectConstructString> spObjectConstructString;
     HRESULT hr = pDispatch->QueryInterface(&spObjectConstructString);
     if (SUCCEEDED(hr))
     {
      BSTR bstrConstruct;
      hr = spObjectConstructString->get_ConstructString(&bstrConstruct);
      if (SUCCEEDED(hr))
      {
       // TODO : Use the string to construct the object.
      }
     }
    
     return hr;
    }
    


  • @drunken: Danke erstmal, doch das Beispiel erstellt doch ein Objekt für eine vordefinierten (IObjectConstructString) und somit nicht unbekannten Typ. Wenn ich falsch liegen sollte, liegts daran, dass ich mich mit COM nicht auskenne 🙄.

    Was soll ich bei dem typedef hinschreiben?
    (s.o. erstellt typedef ohne die Parameterliste einen Fehler und mit erstellt der Compiler, wie von Hume erwähnt, eine (fälschlicherweise) neue Klasse type)

    M.T.



  • 😉

    manuel der code war ein scherz von mir für dich 🙂



  • Na dann seh ich s mal als n verschlaferer Apilscherz 😃

    *immernochaufeinelösunghoff*

    M.T.



  • also, Main::CreateDynamicArray muss die komplette definition von DynamicArray kennen. eine simple forward deklaration reicht da nicht aus (dank an meinen vorredner hume 😃 ;))
    die ODR erlaubt dir bei Templates aber z.b. die gesamte definition nochmal extra vor Main::CreateDynamicArray zu schreiben. du kannst aber auch includes verwenden. und merke: die funktionen von dynamic array können auch später erst definiert werden. die datentypen müssen nur komplett sein.

    gegen das typedef problem, lies dir das durch



  • Hi,
    ich hab jetzt gerade versucht, wie von fisch gesagt, 'CreateDynamicArrayInterface' die komplette Definition zu übergeben, doch dann - "Syntaxfehler : ''template<''" 😞

    int Main::CreateDynamicArrayInterface(template <class type> class DynamicArray *ppDynamicArray)
    {
        //...
        return OK;
    }
    

    Das typedef hab ich dem Artickel nach auch abgeändert:

    //Klassen-Dummy
    template <class type> class DynamicArray;
    
    //Einen Datentyp für die Klasse erstellen
    template <class type> struct LP_DYNAMIC_ARRAY
    {
        typedef DynamicArray<class type>* Array;
    };
    

    Bitte versucht den o.g. Code so zu umzuschreiben, dass er funktioniert. Da das mein erster Template-Versuch ist, kann ich mit den Erklärungen leider nicht viel anfangen ...

    Danke für eure Geduld 🙂

    M.T.



  • @<drunken>:
    Endlich mal einer der gestern auch saufen war. Naja, eigentlich heißt es ja drunk und nicht drunken... 😉

    EDIT: Toll, und sowas war jetzt mein 1000. Beitrag... 😃

    [ Dieser Beitrag wurde am 05.04.2003 um 10:18 Uhr von MaSTaH editiert. ]



  • @MaSTaH: Glückwunsch 😃

    BTW: Das war jetzt mein 722.

    M.T.



  • Danke 😃

    [ Dieser Beitrag wurde am 05.04.2003 um 12:32 Uhr von MaSTaH editiert. ]



    1. nerven solche sinnlosen posts ungemein.
      sie zerstören nicht nur den thread sondern solche meldungen interessiert doch niemanden! behaltet das für euch oder spielt in dem Offtopic Forum rum - denn genau dafür wurde es aufgemacht!

    2. schön dass ihr schon eine Menge posts habt!
      aber
      das sagt nichts über die qualität eurer posts aus oder über euer fachwissen.
      und sie sagt auch nix über die anzahl sinnvoller posts aus - also gebt damit nicht an.

    3. sorry, dass ich helfe diesen thread noch weiter zu zerstören, aber irgendwann musste das mal gesagt werden!



  • Original erstellt von Shade Of Mine:
    **1) nerven solche sinnlosen posts ungemein.
    sie zerstören nicht nur den thread sondern solche meldungen interessiert doch niemanden! behaltet das für euch oder spielt in dem Offtopic Forum rum - denn genau dafür wurde es aufgemacht!

    1. schön dass ihr schon eine Menge posts habt!
      aber
      das sagt nichts über die qualität eurer posts aus oder über euer fachwissen.
      und sie sagt auch nix über die anzahl sinnvoller posts aus - also gebt damit nicht an.

    2. sorry, dass ich helfe diesen thread noch weiter zu zerstören, aber irgendwann musste das mal gesagt werden!**

    Sag mal hast du schlecht geschlafen??? Also wer von Qualität redet der sollte so etwas wie du hier auch nicht posten... Reg dich mal ab... Wer sagt denn das ich damit angebe???



  • MaSTaH: RUHE!!



  • Wer sagt denn das ich damit angebe???

    -> niemand, aber wenn nicht, würdest du nicht in fremden Treads 'rumspielen'

    *immernochlangsamtraurigwerdendaufeineantworthoff*

    M.T.



  • Original erstellt von MaSTaH:
    **
    Sag mal hast du schlecht geschlafen??? Also wer von Qualität redet der sollte so etwas wie du hier auch nicht posten... Reg dich mal ab... Wer sagt denn das ich damit angebe???**

    deine fragezeichen taste klemmt.

    wie ich geschlafen habe, ist meine Sache.
    was die qualität meiner Beiträge betrifft: das sollen andere entscheiden. Aber ich schinde keine Postings, ich zerstöre keine Threads (diese ist eine Ausnahme und ich habe mich auch dafür entschuldigt)
    Ich rege mich doch garnicht auf.
    Ich sage, dass du damit angibst. Warum?
    schau mal unter dein Posting, da steht "Beitraege: xxx"
    jeden den es interessiert kann da nachlesen wieviele beitraege du schon geschrieben hast.

    nur um uns zu sagen wieviel beitraege du schon hast, musst du keinen beitrag erstellen.
    sag mir mal ganz fix, was der Sinn von folgendem posting ist:

    @<drunken>:
    Endlich mal einer der gestern auch saufen war. Naja, eigentlich heißt es ja drunk und nicht drunken... EDIT: Toll, und sowas war jetzt mein 1000. Beitrag...

    niemanden interessiert was du gestern abend gemacht hast. wenn du saufen gehst, bitte - aber das interessiert nicht.
    und dass du schon 1000 Beiträge hast, interessiert auch niemanden, weil man das ganz einfach selber nachlesen kann.

    btw: <drunken> als Name muss doch nichts mit saufen zu tun haben - es ist ein NAME

    dein nächster beitrag war folgender (bevor du ihn editiert hast)

    Danke, 1007er

    das interessiert doch auch niemanden, dass du jetzt 1007 beitraege hast. es steht ja eh da!

    aber es ist nicht nur dieser thread, es sind viele gemeint, nicht nur du.
    du hast lediglich das pech, dass mir bei dir der kragen geplatzt ist.

    wenn ihr im Offtopic Forum blödsinn postet, dann tut das. dafür ist es da.

    aber BITTE BITTE BITTE lasst die fachforen nicht so verkommen



  • Also ich sehe nicht dass die Fachforen "verkommen" wie du sagst. Wir sind schließlich alle Menschen und keine Maschinen (zumindest die meisten 😉 ). Wenn wir reine Informationen haben wollen können wir auch alle Bücher lesen, oder? Da steht das alles genauer drin. Es ist doch gerade der Sinn eines Forums das man sich mit anderen Menschen unterhalten kann.

    dein nächster beitrag war folgender (bevor du ihn editiert hast)
    Danke, 1007er
    das interessiert doch auch niemanden, dass du jetzt 1007 beitraege hast. es steht ja eh da!
    *

    Ich habe ihn ja auch nur editiert weil es anscheinend gestört hat. Und das ich Postings schinde ist ja wohl Blödsinn... Es war nur gerade das 1000 und mir ist aufgefallen was ich zu diesem Anlass für einen Mist geschrieben habe. Deshalb das Edit: Toll, und sowas war jetzt mein 1000. Beitrag...

    Ich kann nicht nachvollziehen, dass dir der Kragen platzt. Wenn du demnächst etwas an meinen Postings auszusetzen hast dann sag es doch einfach und werf nicht sofort mit deinen indirekten Beleidigungen um dich, weil das reizt wirklich...



  • Also ich sehe nicht dass die Fachforen "verkommen" wie du sagst. Wir sind schließlich alle Menschen und keine Maschinen (zumindest die meisten ). Wenn wir reine Informationen haben wollen können wir auch alle Bücher lesen, oder? Da steht das alles genauer drin. Es ist doch gerade der Sinn eines Forums das man sich mit anderen Menschen unterhalten kann.

    Sehe ich genauso. Auch in einem Fachforum kann man doch mal nen kleinen Witz am Rande bringen. Der Thread wird erst zerstört wenn sich einer an diesem Witz hochzieht und versucht sich wichtig zu machen. Dann geht die ganze Diskussion um Sinn oder Unsinn nämlich erst los.


Anmelden zum Antworten