我试图通过一个简单的示例来了解如何使用std::enable_if。在阅读完此答案后,我想出一个简单的例子应该不难。我想使用std::enable_if两个成员函数之间进行选择,并只允许使用其中之一。
不幸的是,以下代码无法在gcc 4.7中进行编译,经过数小时的尝试,我一直在问你们我的错误是什么。
#include <utility>
#include <iostream>
template< class T >
class Y {
    public:
        template < typename = typename std::enable_if< true >::type >
        T foo() {
            return 10;
        }
        template < typename = typename std::enable_if< false >::type >
        T foo() {
            return 10;
        }
};
int main() {
    Y< double > y;
    std::cout << y.foo() << std::endl;
}
gcc报告以下问题:
% LANG=C make CXXFLAGS="-std=c++0x" enable_if
g++ -std=c++0x    enable_if.cpp   -o enable_if
enable_if.cpp:12:65: error: `type' in `struct std::enable_if<false>' does not name a type
enable_if.cpp:13:15: error: `template<class T> template<class> T Y::foo()' cannot be overloaded
enable_if.cpp:9:15: error: with `template<class T> template<class> T Y::foo()'
为什么g ++不会为第二个成员函数删除错误的实例化?根据标准,std::enable_if< bool, T = void >::type仅当布尔模板参数为true时存在。但是g ++为什么不将其视为SFINAE?我认为重载错误消息来自g ++不会删除第二个成员函数的问题,并认为这应该是重载。
std::is_same< T, int >::value,! std::is_same< T, int >::value并且给出了相同的结果。