C++ 为什么sfinae过载问题得不到解决

C++ 为什么sfinae过载问题得不到解决,c++,templates,overloading,sfinae,C++,Templates,Overloading,Sfinae,这个版本很好用: template<typename T> struct Foo { template<typename U = T> typename std::enable_if<std::is_same<U,A>::value>::type bar() { std::cout << "1" << std::endl; } template<typename U =

这个版本很好用:

template<typename T>
struct Foo
{
    template<typename U = T>
        typename std::enable_if<std::is_same<U,A>::value>::type
        bar() { std::cout << "1" << std::endl; }

    template<typename U = T> 
        typename std::enable_if<std::is_same<U,B>::value>::type
        bar() { std::cout << "2" << std::endl; }
};  
模板
结构Foo
{
模板
typename std::enable_if::type
bar(){std::cout,因为在#2的情况下,两个
bar
被认为是等效的。当默认模板参数被忽略时,它们不是函数模板签名的一部分。因此它们被视为

template<typename U, typename V>
V bar() { std::cout << "1" << std::endl; }

template<typename U, typename V>
V bar() { std::cout << "2" << std::endl; }
模板

V条(){std::cout默认模板参数值不是函数signature的一部分。这里甚至有一个关于函数中常见错误的注释。@Klaus我修复了该语句。重点是不同的表达式。谢谢!所以我要记住,表达式本身会产生差异。奇怪的是,该表达式类似于签名的一部分。。.但好吧,就像这样;)
template<typename U, typename V>
V bar() { std::cout << "1" << std::endl; }

template<typename U, typename V>
V bar() { std::cout << "2" << std::endl; }