2010-11-05 5 views
5

Moje przeprosiny, jeśli to jest dupe. Znalazłem kilka postów ponownie. zapobieganie niejawnym konwersjom, ale nic nie jest. zachęcanie do ukrytych konstrukcji.Jakie argumenty należy przekazać do funkcji, aby wykonać niejawną konstrukcję obiektu?

Jeśli mam:

class Rect 
{ 
public: 
    Rect(float x1, float y1, float x2, float y2){}; 
}; 

i wolna funkcja:

Rect Scale(const Rect &); 

dlaczego

Rect s = Scale(137.0f, 68.0f, 235.0f, 156.0f); 

nie niejawny budowę const Rect& i zamiast generować ten błąd kompilatora

'Scale' : function does not take 4 arguments 
+1

Jeśli to wymuszasz, to nie jest to domniemane! – RQDQ

Odpowiedz

11

Ponieważ język nie obsługuje tej funkcji. Musisz napisać:

Rect s = Scale(Rect(137.0f, 68.0f, 235.0f, 156.0f)); 
+3

... lub przeciąż Skaluj, aby zaakceptować 4 pływaki. – visitor

7

"Konwersje" w C++ są między obiektami jednego typu i innego typu. Masz 4 obiekty (wszystkie typu float), więc możesz mieć 4 konwersje do 4 innych typów. Nie ma sposobu na konwersję (w sensie C++ tego słowa) 4 obiektów na jeden obiekt.

2

Myślę, że mówisz o niejawnej konstrukcji przedmiotu. Na przykład,

class IntWrapper { 
    public: 
     IntWrapper(int x) { } 
}; 

void DoSomething(const IntWrapper&) { } 

int main() { 
    DoSomething(5); 
} 

To działa, ponieważ konstruktor IntWrapper „s zajmuje tylko jeden argument. W twoim przypadku, Rect potrzebuje 4 argumentów, więc nie ma żadnej domyślnej konstrukcji.

+0

Sprawdź to pytanie w "wyraźnym", w ten sposób zabraniasz takiego zachowania: http://stackoverflow.com/questions/121162/what-does-the-explicit-keyword-in-c-mean –

3

Niejawna konwersja przez konstruktor odbywa się wtedy i tylko wtedy, gdy konstruktor przyjmuje dokładnie 1 argument i nie jest jawny. W tym przypadku zajmuje to 4, a więc wynik.

Powiązane problemy