#include <iostream>
#include <iomanip>
//---------------------------------------------------------
class Logger {
public:
void write(int x);
void write(double x);
template <typename T>
void writeLine(T x);
};
void Logger::write(int x) {
std::cout << x;
}
void Logger::write(double x) {
std::cout << std::setprecision(3) << x;
}
template <typename T>
void Logger::writeLine(T x) {
write(x);
std::cout << std::endl;
}
//---------------------------------------------------------
class FooType1 {};
class FooType2 {};
class FooLogger : public Logger {
public:
using Logger::write;
void write(FooType1 x);
void write(FooType2 x);
};
void FooLogger::write(FooType1 x) {
std::cout << "<value of type FooType1>";
}
void FooLogger::write(FooType2 x) {
std::cout << "<value of type FooType2>";
}
//---------------------------------------------------------
int main(int argc, char **argv) {
FooLogger log;
FooType1 foo1;
FooType2 foo2;
log.write(42); // OK
log.write(3.14159); // OK
log.write(foo1); // OK
log.write(foo2); // OK
std::cout << std::endl;
log.writeLine(42); // OK
log.writeLine(3.14159); // OK
// log.writeLine(foo1); // error: no matching member function for call to 'write'
// log.writeLine(foo2); // error: no matching member function for call to 'write'
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aW9tYW5pcD4KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpjbGFzcyBMb2dnZXIgewogIHB1YmxpYzoKICAgIHZvaWQgd3JpdGUoaW50IHgpOwogICAgdm9pZCB3cml0ZShkb3VibGUgeCk7CiAgICAKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgdm9pZCB3cml0ZUxpbmUoVCB4KTsKfTsKCnZvaWQgTG9nZ2VyOjp3cml0ZShpbnQgeCkgewogICAgc3RkOjpjb3V0IDw8IHg7Cn0KCnZvaWQgTG9nZ2VyOjp3cml0ZShkb3VibGUgeCkgewogICAgc3RkOjpjb3V0IDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDMpIDw8IHg7Cn0KCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgp2b2lkIExvZ2dlcjo6d3JpdGVMaW5lKFQgeCkgewogICAgd3JpdGUoeCk7CiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKY2xhc3MgRm9vVHlwZTEge307CmNsYXNzIEZvb1R5cGUyIHt9OwoKY2xhc3MgRm9vTG9nZ2VyIDogcHVibGljIExvZ2dlciB7CiAgcHVibGljOgogICAgdXNpbmcgTG9nZ2VyOjp3cml0ZTsKICAgIAogICAgdm9pZCB3cml0ZShGb29UeXBlMSB4KTsKICAgIHZvaWQgd3JpdGUoRm9vVHlwZTIgeCk7Cn07CgoKdm9pZCBGb29Mb2dnZXI6OndyaXRlKEZvb1R5cGUxIHgpIHsKICAgIHN0ZDo6Y291dCA8PCAiPHZhbHVlIG9mIHR5cGUgRm9vVHlwZTE+IjsKfQp2b2lkIEZvb0xvZ2dlcjo6d3JpdGUoRm9vVHlwZTIgeCkgewogICAgc3RkOjpjb3V0IDw8ICI8dmFsdWUgb2YgdHlwZSBGb29UeXBlMj4iOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CiAgICBGb29Mb2dnZXIgbG9nOwogICAgRm9vVHlwZTEgZm9vMTsKICAgIEZvb1R5cGUyIGZvbzI7CiAgICAKICAgIGxvZy53cml0ZSg0Mik7ICAgICAgICAgICAvLyBPSwogICAgbG9nLndyaXRlKDMuMTQxNTkpOyAgICAgIC8vIE9LCiAgICBsb2cud3JpdGUoZm9vMSk7ICAgICAgICAgLy8gT0sKICAgIGxvZy53cml0ZShmb28yKTsgICAgICAgICAvLyBPSwogICAgCiAgICBzdGQ6OmNvdXQgPDwgc3RkOjplbmRsOwogICAgCiAgICBsb2cud3JpdGVMaW5lKDQyKTsgICAgICAgLy8gT0sKICAgIGxvZy53cml0ZUxpbmUoMy4xNDE1OSk7ICAvLyBPSwogICAgLy8gbG9nLndyaXRlTGluZShmb28xKTsgICAgIC8vIGVycm9yOiBubyBtYXRjaGluZyBtZW1iZXIgZnVuY3Rpb24gZm9yIGNhbGwgdG8gJ3dyaXRlJwogICAgLy8gbG9nLndyaXRlTGluZShmb28yKTsgICAgIC8vIGVycm9yOiBubyBtYXRjaGluZyBtZW1iZXIgZnVuY3Rpb24gZm9yIGNhbGwgdG8gJ3dyaXRlJwp9Cg==