Я намагаюся отримати простий приклад для роботи, щоб зрозуміти, як користуватися 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
існує лише тоді, коли параметр булевого шаблону є істинним. Але чому g ++ не вважає це SFINAE? Я думаю, що повідомлення про помилку при перевантаженні походить від проблеми, що g ++ не видаляє функцію другого члена і вважає, що це повинно бути перевантаженням.
std::is_same< T, int >::value
і ! std::is_same< T, int >::value
який дає той же результат.