class OperatorTest {
public:
OperatorTest() = default;
OperatorTest(int a) : a(a) {}
int a = 0;
};
class OperatorInside : public OperatorTest {
public:
using OperatorTest::OperatorTest;
OperatorInside operator+(const OperatorInside &rhs) {
const OperatorInside sum(a + rhs.a);
return sum;
}
};
class OperatorOutside : public OperatorTest {
public:
using OperatorTest::OperatorTest;
};
OperatorOutside operator+(const OperatorOutside &lhs,
const OperatorOutside &rhs) {
const OperatorOutside sum(lhs.a + rhs.a);
return sum;
}
int main() {
OperatorInside ai(1);
OperatorInside bi(2);
OperatorInside si = ai + bi;
OperatorOutside ao(1);
OperatorOutside bo(2);
OperatorOutside so = ao + bo;
}
CgpjbGFzcyBPcGVyYXRvclRlc3QgewpwdWJsaWM6CiAgT3BlcmF0b3JUZXN0KCkgPSBkZWZhdWx0OwogIAogIE9wZXJhdG9yVGVzdChpbnQgYSkgOiBhKGEpIHt9CiAgCiAgaW50IGEgPSAwOwp9OwoKY2xhc3MgT3BlcmF0b3JJbnNpZGUgOiBwdWJsaWMgT3BlcmF0b3JUZXN0IHsKcHVibGljOgogIHVzaW5nIE9wZXJhdG9yVGVzdDo6T3BlcmF0b3JUZXN0OwogIAogIE9wZXJhdG9ySW5zaWRlIG9wZXJhdG9yKyhjb25zdCBPcGVyYXRvckluc2lkZSAmcmhzKSB7CiAgICBjb25zdCBPcGVyYXRvckluc2lkZSBzdW0oYSArIHJocy5hKTsKICAgIHJldHVybiBzdW07CiAgfQp9OwoKY2xhc3MgT3BlcmF0b3JPdXRzaWRlIDogcHVibGljIE9wZXJhdG9yVGVzdCB7CnB1YmxpYzoKICB1c2luZyBPcGVyYXRvclRlc3Q6Ok9wZXJhdG9yVGVzdDsKfTsKCk9wZXJhdG9yT3V0c2lkZSBvcGVyYXRvcisoY29uc3QgT3BlcmF0b3JPdXRzaWRlICZsaHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3BlcmF0b3JPdXRzaWRlICZyaHMpIHsKICAKICBjb25zdCBPcGVyYXRvck91dHNpZGUgc3VtKGxocy5hICsgcmhzLmEpOwogIHJldHVybiBzdW07ICAgICAgICAgICAgICAgICAgCQp9CgppbnQgbWFpbigpIHsKICBPcGVyYXRvckluc2lkZSBhaSgxKTsKICBPcGVyYXRvckluc2lkZSBiaSgyKTsKICAKICBPcGVyYXRvckluc2lkZSBzaSA9IGFpICsgYmk7CiAgCiAgT3BlcmF0b3JPdXRzaWRlIGFvKDEpOwogIE9wZXJhdG9yT3V0c2lkZSBibygyKTsKICAKICBPcGVyYXRvck91dHNpZGUgc28gPSBhbyArIGJvOwp9