Codegear 2007: __property in Klassentemplate mit Indexoperator



  • Hallo,

    folgender Code wird bei mir nicht übersetzt (Codegear RAD Studio 2007):

    #include <map>
    
    template<typename T, typename U>
    class Test
    {
       std::map<T,U>	Values_;
    
       // U get_value( T Key ) const
       // U get_value( T& Key ) const
       U get_value( const T& Key ) const
       {
          std::map<T,U>::const_iterator i = Values_.find( Key );
          if( i != Values_.end() ) 	return i->second;
          else		        return U();
       }
    
    public:
    //   __property U Value[T Key]	= { read=get_value };
    //   __property U Value[T& Key]	= { read=get_value };
       __property U Value[const T& Key]	= { read=get_value };
    };
    
    int main()
    {
       Test<int,int> t;
    }
    

    Die Fehlermeldung dazu lautet:
    `

    [C++ Fehler] (Zeile 20): E2347 Keine Entsprechung der Parameter in read mit Zugriffsspezifikation der Eigenschaft Value

    `

    non-const Methoden funktionieren auch nicht (Versuch Zeilen 8-10), wenn ich allerdings einen konkreten Datentyp statt T benutze lässt sich das übersetzen.
    Weiß jemand, ob das Konstrukt überhaupt funktioniert? Und wenn ja, wie?



  • Ich hab gerade keinen BCC zur Verfügung. Am fehlenden __fastcall wird es wohl nicht liegen; ich nehme an, daß die Logik für __property -Handler einfach nicht auf Templates vorbereitet ist. Ist auch nicht der erste Bug im Zusammenhang mit Properties und Templates, den ich gesehen habe. (Tatsächlich hatte ich bei deinem Post ein déjà vu. Hattest du das Problem nicht schonmal?)

    Und wenn du einfach ein kleines Proxy-Objekt mit überladenem operator [] nimmst? Der wesentliche Sinn von Properties liegt ja in der Typinformation für den Formulardesigner, und die bekommst du hier eh nicht.



  • Ne, ich hatte mal ähnliche Probleme 😉

    Das erste war ein Vektor, der als __property zurückgegeben wurde, auf dem funktioniert der []-Zugriff nicht, da der BCC dann von __property[] ausgeht und da keinen Match findet.
    Das zweite war irgendein Fall, in dem eine Kopie statt Referenz zurückgegeben wurde, das kann ich aber nicht rekonstruieren.

    Ich habe das obige Problem jetzt mit Methoden gelöst, das funktioniert ohne Probleme. Da ich aber einige __property Zugriffe definiert habe möchte ich das gern konsistent halten, aber wenn´s nicht geht ist das auch kein Beinbruch. Wäre nur schön.



  • Unter XE6 kompiliert es so:

    template<typename T, typename U>
    class Test
    {
       std::map<T,U>    Values_;
    
        U get_value( T Key ) const
       // U get_value( T& Key ) const
       //U get_value( const T& Key ) const
       {
          std::map<T,U>::const_iterator i = Values_.find( Key );
          if( i != Values_.end() )  return i->second;
          else              return U();
       }
    
    public:
       __property U Value[T Key]  = { read=get_value };
    //	 __property U Value[T& Key] = { read=get_value };
    //   __property U Value[const T& Key] = { read=get_value };
    };
    
    int main()
    {
       Test<int,int> t;
    }
    

    😉


Log in to reply