Operator-Lookup



  • Hallo Leute,
    ich möchte nebenbei die Implementierung des Cassowary-Algorithmus in ein C++11-Gewand refaktorisieren, aber dazu zählt ersteinmal, den Steinzeitcode zum Kompilieren zu bewegen. Hierbei habe ich gerade mit Compiler-Fehlern zu kämpfen, die aus einer komischen Konvertierungs-Kette bei binären Operatoren entstehen.

    Hier mal runtergebrochen:

    class ClVariable;	// hat keine (Konvertierungs-)Operatoren
    
    template< typename T >
    class ClGenericLinearExpression  {
    public:
    	ClGenericLinearExpression(T num = 0.0);
    	ClGenericLinearExpression(ClVariable clv, T value = 1.0, T constant = 0.0);
    	//...
    
    	friend ClGenericLinearExpression<T> operator-(const ClGenericLinearExpression<T> &e1, const ClGenericLinearExpression<T> &e2);
    };
    
    ClVariable v;
    double lower;
    
    auto some = ClGenericLinearExpression<double>(v - lower);
    // v soll offenbar als ClGenericLinearerExpression<double> gematcht werden
    // lower soll offenbar in ClGenericLinearExpression<double> gematcht werden
    

    Soll (darf/durfte) das jemals kompilieren? Ich bekomme hier überall Fehler, dass keine passenden Operatoren gefunden werden können. Ich renne hier auf VC++2013, falls das eine Auswirkung darauf haben könnte...
    Nirgendwo anders im Projekt werden irgendwelche Operatoren definiert, also bedeuetet es für mich, dass das aus irgendeinem Grund irgendwie für den Autor funktioniert hat? Mich würde es irgendwie ziemlich überraschen, wenn das funktionieren sollte...

    Viele Grüße


  • Mod

    decimad schrieb:

    Hallo Leute,
    ich möchte nebenbei die Implementierung des Cassowary-Algorithmus in ein C++11-Gewand refaktorisieren, aber dazu zählt ersteinmal, den Steinzeitcode zum Kompilieren zu bewegen. Hierbei habe ich gerade mit Compiler-Fehlern zu kämpfen, die aus einer komischen Konvertierungs-Kette bei binären Operatoren entstehen.

    Hier mal runtergebrochen:

    class ClVariable;	// hat keine (Konvertierungs-)Operatoren
    
    template< typename T >
    class ClGenericLinearExpression  {
    public:
    	ClGenericLinearExpression(T num = 0.0);
    	ClGenericLinearExpression(ClVariable clv, T value = 1.0, T constant = 0.0);
    	//...
    
    	friend ClGenericLinearExpression<T> operator-(const ClGenericLinearExpression<T> &e1, const ClGenericLinearExpression<T> &e2);
    };
    
    ClVariable v;
    double lower;
    
    auto some = ClGenericLinearExpression<double>(v - lower);
    // v soll offenbar als ClGenericLinearerExpression<double> gematcht werden
    // lower soll offenbar in ClGenericLinearExpression<double> gematcht werden
    

    Soll (darf/durfte) das jemals kompilieren?

    vermutlich nicht. Der gezeigte Operator kann bloss per ADL gefunden werden, und selbst wenn er sichtbar wäre, Kann der Compiler ja nicht plötzlich einen geeigneten Parameter T herbeizaubern.

    auto some = ClGenericLinearExpression<double>(v) - lower;
    

    wäre kein Problem.



  • Ich hab's mir schon gedacht! Danke Dir. Werde für's erste die nötigen Operatoren hinzufügen, dann kann der Spaß beginnen.


Anmelden zum Antworten