[solved] stronnosc operatorow konwersji

0

Mam taki kod:

class Foo
{
public:
	int operator+(int other)
	{
		return other;
	}
};

class Bar
{
	Foo foo;

public:
	operator Foo&()
	{
		return foo;
	}
};

int main()
{
	Bar bar;
	printf("%i\n", bar + 1); // blad
}

Przy kompilacji wyskakuje błąd error C2676: binary '+' : 'Bar' does not define this operator or a conversion to a type acceptable to the predefined operator. Dlaczego tak jest? przecież bar powinien się przekonwertować do Foo, który ma operator+, tak?

0

Nie, nie powinien, lewa strona operatora nie podlega konwersjom w takim układzie, gdyby operator+ był globalny to byłoby 'nieco' inaczej, C++ nie ma multimetod specjalizowanych na wiele typów. Mało sensowny przykład:

#include <iostream>

class zuo {
  int x;
public:
  zuo(int _x = 68) : x(_x) {}
  operator int() { return x; }

  friend zuo operator+(zuo& zuo, int n);
};

class zuezuo {
  zuo _zuo;
public:
  operator zuo&() { return _zuo; }
};

zuo operator+(zuo& _zuo, int n) { return zuo(_zuo.x + n); }

int main() {
  std::cout << (zuezuo() + 1) << std::endl;
}
0

Wielkie dzieki, nigdy bym nie wpadł na to, żeby użyć globalnych operatorów. Teraz wszystko działa ładnie :-)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.