#include <iostream>
template <class T, class Derived>
class A {
public:
template <class U>
void f(U& bar) {
std::cout << "A's f(U&)\n";
static_cast<Derived*>(this)->f(bar);
}
void f(T& foo) {
std::cout << "A's f(T&)\n";
}
};
class B : public A<int, B>
{
public:
template <class T>
void f(T &foo) {
std::cout << "B's f(T&)\n";
}
};
int main() {
A<int, B>* ptr = new B;
ptr->f("foo");
delete ptr;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIERlcml2ZWQ+CmNsYXNzIEEgewogIHB1YmxpYzoKICAgIHRlbXBsYXRlIDxjbGFzcyBVPgogICAgdm9pZCBmKFUmIGJhcikgewogICAgICBzdGQ6OmNvdXQgPDwgIkEncyBmKFUmKVxuIjsKICAgICAgc3RhdGljX2Nhc3Q8RGVyaXZlZCo+KHRoaXMpLT5mKGJhcik7CiAgICB9CgogICAgdm9pZCBmKFQmIGZvbykgewoJCXN0ZDo6Y291dCA8PCAiQSdzIGYoVCYpXG4iOwogICAgfQp9OwoKCmNsYXNzIEIgOiBwdWJsaWMgQTxpbnQsIEI+CnsKICBwdWJsaWM6CiAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KICAgIHZvaWQgZihUICZmb28pIHsKICAgICAgc3RkOjpjb3V0IDw8ICJCJ3MgZihUJilcbiI7CiAgICB9Cn07CgoKaW50IG1haW4oKSB7CiAgQTxpbnQsIEI+KiBwdHIgPSBuZXcgQjsKICBwdHItPmYoImZvbyIpOwogIGRlbGV0ZSBwdHI7CiAgcmV0dXJuIDA7Cn0K