std :: enable_if для условной компиляции функции-члена

Я пытаюсь привести простой пример, чтобы понять, как его использовать std::enable_if. Прочитав этот ответ , я подумал, что не составит труда найти простой пример. Я хочу использовать std::enable_if для выбора между двумя функциями-членами и разрешить использовать только одну из них.

К сожалению, следующее не компилируется с gcc 4.7, и после нескольких часов попыток я спрашиваю вас, ребята, в чем моя ошибка.

#include 
#include 

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' does not name a type
enable_if.cpp:13:15: error: `template template T Y::foo()' cannot be overloaded
enable_if.cpp:9:15: error: with `template template T Y::foo()'

Почему g ++ не удаляет неправильные экземпляры для второй функции-члена? Согласно стандарту, std::enable_if< bool, T = void >::type существует, только когда параметр логического шаблона имеет значение true. Но почему g ++ не считает это SFINAE? Я думаю, что сообщение об ошибке перегрузки происходит из-за того, что g ++ не удаляет вторую функцию-член и считает, что это должно быть перегрузкой.

144
задан Community 23 May 2017 в 11:54
поделиться