#include <iostream>
#include <string>
namespace test {
struct myClass {
std::string _name;
explicit myClass(std::string name) : _name{ name } {}
void print(std::ostream& os) const { os << _name; }
};
std::ostream& operator<<(std::ostream& os, const myClass& mC) {
mC.print(os); return os;
}
namespace debug {
std::ostream& operator<<(std::ostream& os, const myClass& mC) {
os << "debug: ";
mC.print(os);
return os;
}
}
}
test::myClass mc{"Kai"};
void run() {
using namespace test;
std::cout << mc << std::endl;
}
void runDebug() {
using test::debug::operator<<;
std::cout << mc << std::endl; // das erzeugt den Fehler
// test::debug::operator<<(std::cout, mc) << std::endl; // so klappt das
}
int main() {
run();
runDebug();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKbmFtZXNwYWNlIHRlc3QgewoJc3RydWN0IG15Q2xhc3MgewoJCXN0ZDo6c3RyaW5nIF9uYW1lOwoKCQlleHBsaWNpdCBteUNsYXNzKHN0ZDo6c3RyaW5nIG5hbWUpIDogX25hbWV7IG5hbWUgfSB7fQoJCXZvaWQgcHJpbnQoc3RkOjpvc3RyZWFtJiBvcykgY29uc3QgeyBvcyA8PCBfbmFtZTsgfQoJfTsKCglzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgbXlDbGFzcyYgbUMpIHsKCQltQy5wcmludChvcyk7CXJldHVybiBvczsKCX0KCgluYW1lc3BhY2UgZGVidWcgewoJCXN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBteUNsYXNzJiBtQykgewoJCQlvcyA8PCAiZGVidWc6ICI7CgkJCW1DLnByaW50KG9zKTsKCQkJcmV0dXJuIG9zOwoJCX0KCX0KfQoKdGVzdDo6bXlDbGFzcyBtY3siS2FpIn07Cgp2b2lkIHJ1bigpIHsKCXVzaW5nIG5hbWVzcGFjZSB0ZXN0OwoJc3RkOjpjb3V0IDw8IG1jIDw8IHN0ZDo6ZW5kbDsKfQoKdm9pZCBydW5EZWJ1ZygpIHsKCXVzaW5nIHRlc3Q6OmRlYnVnOjpvcGVyYXRvcjw8OwoJc3RkOjpjb3V0IDw8IG1jIDw8IHN0ZDo6ZW5kbDsJCS8vIGRhcyBlcnpldWd0IGRlbiBGZWhsZXIKCS8vIHRlc3Q6OmRlYnVnOjpvcGVyYXRvcjw8KHN0ZDo6Y291dCwgbWMpIDw8IHN0ZDo6ZW5kbDsJCS8vIHNvIGtsYXBwdCBkYXMKCn0KCmludCBtYWluKCkgewoJcnVuKCk7CglydW5EZWJ1ZygpOwoJCglyZXR1cm4gMDsKfQo=
prog.cpp: In function ‘void runDebug()’:
prog.cpp:34:12: error: ambiguous overload for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream<char>’} and ‘test::myClass’)
std::cout << mc << std::endl; // das erzeugt den Fehler
~~~~~~~~~~^~~~~
prog.cpp:17:17: note: candidate: ‘std::ostream& test::debug::operator<<(std::ostream&, const test::myClass&)’
std::ostream& operator<<(std::ostream& os, const myClass& mC) {
^~~~~~~~
prog.cpp:12:16: note: candidate: ‘std::ostream& test::operator<<(std::ostream&, const test::myClass&)’
std::ostream& operator<<(std::ostream& os, const myClass& mC) {
^~~~~~~~