Du bist nicht angemeldet.

Werbeanzeige

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

1

28.06.2016, 01:37

This pointer L-Value

Hallo!
Ich verzweifel langsam an einem Stück Code, welcher mit VS2014 problemlos kompiliert wurde, nun jedoch mit VS2015 nicht mehr.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Color
{
public:
    union
    {
        struct
        {
            double x;
            double y;
            double z;
        };

        double c[3];
    };

    Color() : x(0.0), y(0.0), z(0.0) {}
    Color(const double& t) : x(t), y(t), z(t) {}
    Color(const double& _x, const double& _y, const double& _z = 0.0) : x(_x), y(_y), z(_z) {}
    Color(const Color& _v) : x(_v.x), y(_v.y), z(_v.z) {}
    Color(const double* comp) : x(comp[0]), y(comp[1]), z(comp[2]) {}

    Color& operator = (const Color& v) { x = v.x; y = v.y; z = v.z;     return *this; }
    Color& operator += (const Color& v) { x += v.x; y += v.y; z += v.z; return *this; }
    Color& operator -= (const Color& v) { x -= v.x; y -= v.y; z -= v.z; return *this; }
    Color& operator *= (const Color& v) { x *= v.x; y *= v.y; z *= v.z; return *this; }
    Color& operator *= (const double& f) { x *= f; y *= f; z *= f;      return *this; }
    Color& operator /= (const Color& v) { x /= v.x; y /= v.y; z /= v.z; return *this; }
    Color& operator /= (const double& f) { x /= f; y /= f; z /= f;      return *this; }

    Color operator + (const Color& v) const { return Color(x + v.x, y + v.y, z + v.z); }
    Color operator - (const Color& v) const { return Color(x - v.x, y - v.y, z - v.z); }
    Color operator - () const { return Color(-x, -y, -z); }
    Color operator * (const Color& v) const { return Color(x * v.x, y * v.y, z * v.z); }
    Color operator * (const double& v) const { return Color(x * v, y * v, z * v); }
    Color operator / (const Color& v) const { return Color(x / v.x, y / v.y, z / v.z); }
    Color operator / (const double& v) const { return Color(x / v, y / v, z / v); }

    double          LengthSq() const { return x*x + y*y + z*z; }
    void            NormalizeEx() { this /= sqrt(LengthSq() + 0.0000001); }
    Color           Interpolate(const Color& v, const double& t)     { return Color(this + t * (v - this)).NormalizeEx(); }
};


Aufruf:

C-/C++-Quelltext

1
2
Color blended = ...;
Color result = blended.Interpolate(luminancePreservedRGB, luminancePreservation);


Ich bekomme aus mir unerklärlichen Gründen folgende Fehlermeldung:

Quellcode

1
Error   C2678   binary '-': no operator found which takes a left-hand operand of type 'const Color' (or there is no acceptable conversion) (Zeile 40)

sowie

Quellcode

1
Error   C2296   '/=': illegal, left operand has type 'Color *const ' (Zeile 39)


Kann mir jemand auf die Sprünge helfen, was ich falsch gemacht habe?

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veralteten strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

2

28.06.2016, 02:15

this sollte *this sein

TrommlBomml

Community-Fossil

Beiträge: 2 143

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

3

28.06.2016, 08:33

Stimme ich zu. Ich frage mich wie das je funktioniert haben kann?!

@dot: dein Einsatz :P

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

4

28.06.2016, 12:03

Sicher dass das so wirklich jemals funktioniert hat? Ich kann mich an keine MSVC Version erinnern, die diesen Code kompilieren sollte...

Das Problem wurde ja bereits genannt: this ist ein Pointer prvalue, keine Referenz. Abgesehen davon sei darauf hingewiesen, dass dieses Konstrukt mit der union, das wohl dazu dient, auf x, z, y auch per [] zugreifen zu können, streng genommen zu undefiniertem Verhalten führt... ;)

FSA

Community-Fossil

  • »FSA« ist der Autor dieses Themas
  • Private Nachricht senden

5

28.06.2016, 12:48

Der Code ist schon alt, hatte ihn nur wieder herausgekramt. Vielleicht habe ich auch irgendwann etwas geändert, von dem ich nichts mehr weiß.

@dot: Hast du da ein Link zu?

Grüße und Danke :thumbup:

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veralteten strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

dot

Supermoderator

Beiträge: 9 833

Wohnort: Graz

  • Private Nachricht senden

6

28.06.2016, 12:58

@dot: Hast du da ein Link zu?

Zu was genau? In einer C++ union darf immer nur der Member gelesen werden, der zuletzt beschrieben wurde (seit C++11 gibt es eine Ausnahme für unions aus standard layout structs mit einer common initial sequence, die greift hier nach meiner Interpretation des Standard aber leider nicht)...

Werbeanzeige