我正在尝试找一个简单的例子来理解如何使用
不幸的是,下面的代码在gcc 4.7上无法编译,经过数个小时的尝试之后,我想请教你们我犯了什么错误。
gcc报告了以下问题:
为什么g++不删除第二个成员函数的错误实例化? 根据标准,
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++不删除第二个成员函数并认为这应该是一个重载的问题。
std::is_same< T, int >::value
和! std::is_same< T, int >::value
,它们会给出相同的结果。 - evnu