1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | #include <iostream> class Interface {}; class Impl: public Interface {}; class Bar { struct fallback { fallback(int) {} }; template<typename T> void foo(T& t, fallback) { std::cout << "generic\n"; } void foo(Interface& t, int) { std::cout << "overload\n"; } public: template<typename T> void foo(T& t) { foo(t, 0); } }; template<> void Bar::foo<Interface>(Interface& t) { std::cout << "specialization\n"; } int main() { Bar bar; Impl impl; Interface& interface = impl; bar.foo(impl); bar.foo(interface); return 0; } |
I2luY2x1ZGUgPGlvc3RyZWFtPgoKY2xhc3MgSW50ZXJmYWNlIHt9OwpjbGFzcyBJbXBsOiBwdWJsaWMgSW50ZXJmYWNlIHt9OwoKY2xhc3MgQmFyCnsKICAgIHN0cnVjdCBmYWxsYmFjayB7IGZhbGxiYWNrKGludCkge30gfTsKICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgZm9vKFQmIHQsIGZhbGxiYWNrKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJnZW5lcmljXG4iOwogICAgfQogICAgdm9pZCBmb28oSW50ZXJmYWNlJiB0LCBpbnQpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIm92ZXJsb2FkXG4iOwogICAgfQpwdWJsaWM6CiAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGZvbyhUJiB0KSB7CiAgICAgICAgZm9vKHQsIDApOwogICAgfQp9Owp0ZW1wbGF0ZTw+IHZvaWQgQmFyOjpmb288SW50ZXJmYWNlPihJbnRlcmZhY2UmIHQpIHsKICAgIHN0ZDo6Y291dCA8PCAic3BlY2lhbGl6YXRpb25cbiI7Cn0KCmludCBtYWluKCkgewogICAgQmFyIGJhcjsKICAgIEltcGwgaW1wbDsKICAgIEludGVyZmFjZSYgaW50ZXJmYWNlID0gaW1wbDsKICAgIGJhci5mb28oaW1wbCk7CiAgICBiYXIuZm9vKGludGVyZmFjZSk7CiAgICByZXR1cm4gMDsKfQ==
prog.cpp: In member function ‘void Bar::foo(T&) [with T = Impl]’: prog.cpp:28: instantiated from here prog.cpp:17: error: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: prog.cpp:12: note: candidate 1: void Bar::foo(Interface&, int) prog.cpp:9: note: candidate 2: void Bar::foo(T&, Bar::fallback) [with T = Impl]
-
result: Compilation error (maybe you wish to see an example for C++ 4.7.2)


