Announcement

Collapse
No announcement yet.

[Compiler Error C2392] "Methode": Covariant-Rückgabetypen...???

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • [Compiler Error C2392] "Methode": Covariant-Rückgabetypen...???

    [Compiler Error C2392]

    "Methode": Covariant-Rückgabetypen werden in verwalteten Typen nicht unterstützt

    Hallo miteinander,

    ich versuche eine Klasse SRow, die von ArrayList erbt zu implementieren.
    Dabe möchte ich die property "Item" wie folgt neu definieren (siehe dazu auskommentierten source code). Der
    Compiler meldet dann die o.g. Fehlermeldung und ich kann mit dieser nichts anfangen. Ich verstehe nicht was er
    damit meint.
    Da mir nichts besseres eingefallen ist, habe ich anstatt die property "Item" von ArrayList zu benutzen habe ich eine
    neue property "Items" definiert, diese funktioniert (keine Compilermeldungen). Aber ich würde ganz gerne, die geerbte property
    Item benutzen die auf meine struct PSCell zeigt.

    Wäre toll, wenn jemand eine Idee hätte oder zumindestens mir etwas genaueres über den o.g. Fehler etwas sagen könnte (die Hilfe
    hat mich nicht voll aufgeklärt).

    Danke

    MfG

    Paulo Ferreira
    <PRE>
    // MatLib.h

    #pragma once
    #include <vcclr.h>

    using namespace System;

    namespace MatLib
    {
    // Sparse matrix cell
    public __gc struct PSCell : public System::Object
    {
    public:
    int Col, Row; // location of this cell in the matrix
    double Value; // value to hold in the cell
    };

    public __gc class SRow : public System::Collections::ArrayList
    {
    private:
    int FRowNum;
    PSCell* ACell ;

    public:
    SRow(int ARowNum)
    {
    FRowNum = ARowNum;
    };

    ~SRow()
    {
    Clear();
    // ??? Wird der Speicher auch freigegeben ???
    // Dispose -> Methode ?
    };

    virtual bool Find(int ACellCol, int & Index)
    {
    int L, H, C, I;
    bool Result = false;
    L = 0;
    H = Count - 1;
    while(L <= H)
    {
    I = (L + H) >> 1;
    if (Items[I]->Col < ACellCol)
    {
    L = I + 1;
    }
    else
    {
    H = I - 1;
    if (Items[I]->Col = ACellCol)
    {
    Result = true;
    L = I;
    }
    }
    }
    Index = I;
    return Result;
    };

    virtual int Add(const int ACellCol, const double AValue)
    {
    int Result;

    Find(ACellCol, Result);
    // Create New Cell
    ACell = new PSCell();
    ACell->Value = AValue;
    ACell->Col = ACellCol;
    ACell->Row = FRowNum;
    // Insert
    Insert(Result, ACell);
    return Result;
    };

    //__property virtual PSCell *get_Item(int index){ return (PSCell*)ArrayList::get_Item(index); }
    //__property virtual void set_Item(int index, PSCell*){ArrayList::set_Item(index, ACell); }
    __property virtual PSCell *get_Items(int index){ return (PSCell*)ArrayList::get_Item(index); }
    __property virtual void set_Items(int index, PSCell*){ArrayList::set_Item(index, ACell); }

    };
    <PRE>

  • #2
    Hallo,

    &gt;"Methode": Covariant-Rückgabetypen werden in verwalteten Typen nicht unterstützt <br>
    &gt;..<br>
    &gt;Dabei möchte ich die property "Item" wie folgt neu definieren..

    es gibt bereits die geerbte Eigenschaft Item. Die Hilfe schreibt auf der Seite <i>ArrayList Members</i> dazu folgendes: "<i>.. this property is the indexer for the ArrayList class.</i>".
    <pre>
    [C++]
    public: __property virtual Object* get_Item(
    int index
    );
    public: __property virtual void set_Item(
    int index,
    Object*
    );
    </pre>
    Die geerbte Methode liefert Object* zurück, aber die eigene Implementierung nutzt PSCell* - daher auch das Veto "Covariant-Rückgabetypen".

    In C# würde ich zur Deklaration <b>public new virtual</b> greifen, um die geerbte Methode neu zu implementieren (d.h. den Vorfahren auszublenden). Ich habe aber keine Ahnung, wie das in C++ geht (ich habe noch niemals mit C++ arbeiten müssen, so dass ich mit meiner Antwort auch völlig daneben liegen könnte)

    Comment


    • #3
      Genauso habe ich es auch in C# realisiert:

      mit public new PSCell....

      aber da hilft dir ja der Compiler und weist dich darauf hin, dass es nur mit dem virtual bzw. new
      funktioniert.

      So..., jetzt muss ich aber in C++ programmieren (Vorgabe). Das habe ich mir genauso gedacht,
      Vorfahren ausblenden evt. mit new, aber denkste. Ich finde dazu irgendwie nix in der Hilfe.

      Ich schwöre, dass es mein letztes Projekt in C++ war, ich hoffe doch sehr das dieses Urgestein von
      Programmiersprache ausstirbt und dafür C# endlich als der Nachfolger seine Stelle antritt.

      Naja, dann werde ich mich wohl mit Items anstatt mit Item anfreunden müssen.

      Danke Gruss

      Paulo Ferreir

      Comment

      Working...
      X