Niejawna konwersja w konstruktorze

0

Witam!

Napotkałem problem podczas projektowania klas.
Jest mi bardzo ciężko opisać go słowami, więc wklejam minimalistyczny kod prezentujący problem (kompilowany pod MinGW) wraz z opisem.

#include <string> 

class pochodna_stringa { // klasa konstruowana z std::string'a
public:
	pochodna_stringa(const std::string& str) { }
};

class wykorzystujaca_pochodna_stringa { // klasa kontruowana z powyższej klasy
public:
	wykorzystujaca_pochodna_stringa(pochodna_stringa& poch_str) {

	}
};

/*
Podczas inicjalizowania obiektu klasy pochodna_stringa const char[]'em -> konstrukcja przebiega sprawnie. 
Natomiast wydaje się nie być możliwym skonstruowanie klasy wykorzystujaca_pochodna_stringa za pomocą const char[]. Nie zachodzi niejawna konstrukcja const char[] -> std::string -> pochodna_stringa. Dlaczego tak się dzieje? Dlaczego const char[] -> std::string niejawne jest OK, a krok dalej już nie pójdzie? 
*/

int main() {

	pochodna_stringa("abcdef"); // poprawnie zostaje dokonana niejawna konwersja const char[] do const std::string
	wykorzystujaca_pochodna_stringa("abcdef"); // Error: No matchin function for call
	return 0; 

} 

Podczas inicjalizowania obiektu klasy pochodna_stringa const char[]'em -> konstrukcja przebiega sprawnie.
Natomiast wydaje się nie być możliwym skonstruowanie klasy wykorzystujaca_pochodna_stringa za pomocą const char[]. Nie zachodzi niejawna konstrukcja const char[] -> std::string -> pochodna_stringa. Dlaczego tak się dzieje? Dlaczego const char[] -> std::string niejawne jest OK, a krok dalej już nie pójdzie?

Oczywiście proste rozwiązanie brzmi:
wykorzystujaca_pochodna_stringa(pochodna_stringa("abcdef"));
Ale czy jedyne...?

Z góry dziękuję za odpowiedź ;]
Pozdrawiam.

2

Możesz mieć tylko jedną niejawną konwersję danej wartości.

0

wykorzystujaca_pochodna_stringa(pochodna_stringa& poch_str) - brakuje const! Czyli kompilator nie może stworzyć obiektu tymczasowego bo zakłąda, że przez referencje zwracasz jakąś wartość.

0

Eee, za dużo flame'u ;]

To, że dało radę to zrobić za pomocą
wykorzystujaca_pochodna_stringa(pochodna_stringa("abcdef"));
To to jest dość jasne.

Pogooglowałem, i Zjarek ma rację, jesteśmy narzuceni ograniczeniem max jednej konwersji:
ISO/IEC 14882:2003, §12.3.4 "At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value."

Temat rozwiązany, dzięki za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1