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.