#include <iostream>
typedef void (*vfunp)(...);
template <typename A>
struct X
{
void a1 () { (int)(vfunp)A::foo<2>(5); };
void a2 () { (int)(vfunp)A::template foo<2>(5); }
};
struct Y
{
static void foo(...) { }
template <int> static void* foo(...) { std::cout << "Oops!" << std::endl; return 0; }
};
int main ()
{
X<Y> moo;
moo.a1();
moo.a2();
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp0eXBlZGVmIHZvaWQgKCp2ZnVucCkoLi4uKTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBBPgpzdHJ1Y3QgWAp7CiAgdm9pZCAgYTEgKCkgeyAoaW50KSh2ZnVucClBOjpmb288Mj4oNSk7IH07CiAgdm9pZCAgYTIgKCkgeyAoaW50KSh2ZnVucClBOjp0ZW1wbGF0ZSBmb288Mj4oNSk7IH0KCn07CgpzdHJ1Y3QgWQp7CiAgc3RhdGljIHZvaWQgZm9vKC4uLikgeyB9CiAgdGVtcGxhdGUgPGludD4gc3RhdGljIHZvaWQqIGZvbyguLi4pIHsgc3RkOjpjb3V0IDw8ICJPb3BzISIgPDwgc3RkOjplbmRsOyByZXR1cm4gMDsgfQp9OwoKaW50IG1haW4gKCkKewogIFg8WT4gbW9vOwogIG1vby5hMSgpOwogIG1vby5hMigpOwp9