#include <iostream>
using namespace std;
#include <type_traits>
template <typename T>
struct foo
{
template <typename U = T>
typename std::enable_if<false == std::is_same<U, long>::value>::type
bar1 (int)
{cout<<"bar1\n"; }
template <typename U = T>
typename std::enable_if<false == std::is_same<U, long>::value, int>::type
bar2 ()
{ cout<<"bar2\n"; return 0; }
};
int main()
{
foo<int> fi;
foo<long> fl;
fi.bar1(0); // compile
fi.bar2(); // compile
fl.bar1<int>(0); // compilation error
// fl.bar2(); // compilation error
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBmb28KIHsKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFUgPSBUPgogICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxmYWxzZSA9PSBzdGQ6OmlzX3NhbWU8VSwgbG9uZz46OnZhbHVlPjo6dHlwZQogICAgICBiYXIxIChpbnQpCiAgICAgICB7Y291dDw8ImJhcjFcbiI7IH0KCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVID0gVD4KICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZmFsc2UgPT0gc3RkOjppc19zYW1lPFUsIGxvbmc+Ojp2YWx1ZSwgaW50Pjo6dHlwZQogICAgICBiYXIyICgpCiAgICAgICB7IGNvdXQ8PCJiYXIyXG4iOyByZXR1cm4gMDsgfQogfTsKCmludCBtYWluKCkKIHsKICAgZm9vPGludD4gIGZpOwogICBmb288bG9uZz4gZmw7CgogICBmaS5iYXIxKDApOyAvLyBjb21waWxlCiAgIGZpLmJhcjIoKTsgIC8vIGNvbXBpbGUKCiAgICBmbC5iYXIxPGludD4oMCk7IC8vIGNvbXBpbGF0aW9uIGVycm9yCiAgIC8vIGZsLmJhcjIoKTsgIC8vIGNvbXBpbGF0aW9uIGVycm9yCiB9Cg==