std::enable_if zum bedingten kompilieren einer member-Funktion

Ich versuche ein einfaches Beispiel zu arbeiten, um zu verstehen, wie std::enable_if. Nachdem ich gelesen diese Antwort, dachte ich, es sollte nicht allzu schwer zu kommen mit einem einfachen Beispiel. Ich will std::enable_if zu wählen zwischen zwei member-Funktionen und dass nur einer von Ihnen verwendet werden.

Leider die folgenden nicht kompilieren mit gcc 4.7 und nach Stunden und Stunden zu versuchen, bitte ich Euch, Jungs, was mein Fehler ist.

#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-berichten die folgenden Probleme:

% 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()'

Warum nicht g++ löschen Sie den falschen-Instanziierung für die zweite member-Funktion? Laut Norm std::enable_if< bool, T = void >::type nur dann existiert, wenn die boolschen template-parameter true ist. Aber warum nicht g++ betrachten dies als SFINAE? Ich denke, dass die überlastung Fehlermeldung kommt das problem, dass g++ nicht löschen die zweite member-Funktion, und ist der Auffassung, dass dies eine überlastung.

Ich bin mir nicht sicher, aber ich glaube es sind die folgenden: enable_if basiert auf SFINAE (substitution Misserfolg ist nicht ein Fehler). Jedoch, Sie haben noch keine substitution, weil kein parameter kann nicht verwendet werden, um zu bestimmen, die überlastung zu verwenden. Sie sollten versuchen, die "wahr" und "falsch" hängt von T. (ich weiß, dass Sie nicht wollen, es zu tun in das einfache Beispiel, aber es ist wohl zu einfach, jetzt...)
Ich dachte das auch und habe std::is_same< T, int >::value und ! std::is_same< T, int >::value gibt das gleiche Ergebnis.

InformationsquelleAutor evnu | 2011-08-07

Schreibe einen Kommentar