Я прочитал, что стандартное преобразование может предшествовать или следовать преобразованию, выполняемому оператором преобразования или преобразованием типа конструктора. С другой стороны,
последовательность двух операторов преобразования не допускается
последовательность двух преобразований типов конструкторов не допускается
Я решил проверить это и получил другой результат. Я использую MSVC2010
В первом коде связки это не получается: int b1 = sMe; это здорово, поскольку подразумевает последовательность из двух операторов преобразования: один из myString в myType, а другой из myType в int
Во втором коде связки это НЕ ДАЕТ: myString sYou (b); хотя я полагаю, что это подразумевает последовательность двух преобразований конструктора: одно из int в myType, другое из myType в myString.
Может кто-нибудь объяснить мне, чего мне не хватает?
Большое спасибо,
ПЕРВЫЙ Гроздь
class myType {
public:
myType(): val(10) {}
myType(const myType &orig): val(orig.val) {}
myType(int v1): val(v1) {}
bool hasSameValue(const myType &o2) {
return (o2.val == val); }
int getVal() {
return val; }
operator int() { return val; }
private:
int val;
};
#include <string>
class myString {
public:
myString(): val("I Dont Know you") {}
myString(const myString &orig): val(orig.val) {}
myString(myType v1): val("Really Dont know you") {}
bool hasSameValue(const myString &o2) {
return (o2.val == val); }
std::string getVal() {
return val; }
std::string getString() {return val;}
operator myType() { return 1000; }
private:
std::string val;
};
#include <iostream>
using namespace std;
int main() {
int b = 36;
myString sMe;
myString sYou(b);
cout << "sYou: " << sYou.getString() << endl;
cout << "sMe: " << sMe.getString() << endl;
myType a = sMe;
cout << a.getVal() << endl;
int b1 = sMe;
return 1;
}
ВТОРОЙ ПУЧОК
class myType {
public:
myType(): val(10) {}
myType(const myType &orig): val(orig.val) {}
myType(int v1): val(v1) {}
bool hasSameValue(const myType &o2) {
return (o2.val == val); }
int getVal() {
return val; }
private:
int val;
};
#include <string>
class myString {
public:
myString(): val("I Dont Know you") {}
myString(const myString &orig): val(orig.val) {}
myString(myType v1): val("Really, I Dont Know you") {}
bool hasSameValue(const myString &o2) {
return (o2.val == val); }
std::string getVal() {
return val; }
std::string getString() {return val;}
private:
std::string val;
};
#include <iostream>
using namespace std;
int main() {
myType me;
int a = 34;
int b = 36;
myType you(a);
bool sameVal = you.hasSameValue(b);
cout << sameVal << endl;
cout << "you: " << you.getVal() << endl;
cout << "me: " << me.getVal() << endl;
myString sMe;
myString sYou(b);
cout << "sYou: " << sYou.getString() << endl;
cout << "sMe: " << sMe.getString() << endl;
return 1;
}