#include <iostream>
template <typename T>
void print (T i)
{
std::cout << "simple" << std::endl;
}
template <template<typename> class FF, typename TT>
void print (FF<TT> i)
{
std::cout << "template" << std::endl;
}
template <>
void print<int>(int i)
{
std::cout << "int" << std::endl;
}
template <typename T>
struct R
{
T x;
};
int main()
{
R<int> r;
print<int>(1.1); // ok, prints int
print(1.1); // ok, prints simple
print<int>(1); // ok, prints int
print(1); // ok, prints int
print(r); // ok, prints template
print< R<int> >(r); // ?? why simple ??
print< R,int >(r); // ?? why simple ??
// gcc 4.6.2 (-std=c++0x) and 4.8.1 (-std=c++11)
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnZvaWQgcHJpbnQgKFQgaSkKewogICAgICAgIHN0ZDo6Y291dCA8PCAic2ltcGxlIiA8PCBzdGQ6OmVuZGw7Cn0KdGVtcGxhdGUgPHRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyBGRiwgdHlwZW5hbWUgVFQ+CnZvaWQgcHJpbnQgKEZGPFRUPiBpKQp7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJ0ZW1wbGF0ZSIgPDwgc3RkOjplbmRsOwp9Cgp0ZW1wbGF0ZSA8Pgp2b2lkIHByaW50PGludD4oaW50IGkpCnsKICAgICAgICBzdGQ6OmNvdXQgPDwgImludCIgPDwgc3RkOjplbmRsOwp9CgoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CnN0cnVjdCBSCnsKICAgICAgICBUIHg7Cn07CgppbnQgbWFpbigpCnsKICAgICAgICBSPGludD4gIHI7CiAgICAgICAgcHJpbnQ8aW50PigxLjEpOyAgICAgICAgICAvLyBvaywgcHJpbnRzIGludAogICAgICAgIHByaW50KDEuMSk7ICAgICAgICAgICAgICAgLy8gb2ssIHByaW50cyBzaW1wbGUKICAgICAgICBwcmludDxpbnQ+KDEpOyAgICAgICAgICAgIC8vIG9rLCBwcmludHMgaW50CiAgICAgICAgcHJpbnQoMSk7ICAgICAgICAgICAgICAgICAvLyBvaywgcHJpbnRzIGludAogICAgICAgIHByaW50KHIpOyAgICAgICAgICAgICAgICAgLy8gb2ssIHByaW50cyB0ZW1wbGF0ZQogICAgICAgIHByaW50PCBSPGludD4gPihyKTsgICAgICAgLy8gPz8gd2h5IHNpbXBsZSA/PwogICAgICAgIHByaW50PCBSLGludCA+KHIpOyAgICAgICAvLyA/PyB3aHkgc2ltcGxlID8/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnY2MgNC42LjIgKC1zdGQ9YysrMHgpIGFuZCA0LjguMSAoLXN0ZD1jKysxMSkKfQ==