【发布时间】:2011-10-21 18:58:05
【问题描述】:
我试图通过一个简单的示例来了解如何使用std::enable_if。在我阅读this answer 之后,我认为想出一个简单的例子应该不会太难。我想使用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++没有删除第二个成员函数的问题,认为这应该是一个重载。
【问题讨论】:
-
我不确定,但我认为它是以下内容: enable_if 基于 SFINAE (替换失败不是错误)。但是,这里没有任何替换,因为没有参数不能用于确定要使用的重载。你应该让“真”和“假”依赖于 T。(我知道你不想在简单的例子中这样做,但现在可能太简单了......)
-
我也想到了这一点,并尝试使用
std::is_same< T, int >::value和! std::is_same< T, int >::value得到相同的结果。