Pourquoi erreur de compilation avec enable_if

Pourquoi cela ne compile pas avec gcc48 et clang32?

#include <type_traits>

template <int N> 
struct S {

    template<class T> 
    typename std::enable_if<N==1, int>::type
    f(T t) {return 1;};

    template<class T> 
    typename std::enable_if<N!=1, int>::type
    f(T t) {return 2;};
};

int main() {
    S<1> s1;
    return s1.f(99);
}

GCC erreur:

/home/lvv/p/sto/test/t.cc:12:2: error: no type named type in struct enable_if<false, int>’
  f(T t) {return 2;};
  ^

CLANG erreur:

/home/lvv/p/sto/test/t.cc:11:26: error: no type named 'type' in 'std::enable_if<false, int>'; 'enable_if' cannot be used to
      disable this declaration
        typename std::enable_if<N!=1, int>::type
                                ^~~~
/home/lvv/p/sto/test/t.cc:16:7: note: in instantiation of template class 'S<1>' requested here
        S<1> s1;
             ^

EDIT - SOLUTION

J'ai accepté la réponse de Charles de la Salvia, mais pour des raisons pratiques, je n'ai pas été en mesure d'utiliser la solution de contournement qui a été proposé (se spécialisent sur N). J'ai trouvé d'autres solution qui fonctionne pour moi. Faire enable_if dépendent T:

typename std::enable_if<(sizeof(T),N==1), int>::type
  • Êtes-vous sûr que cela va fonctionner, de toute façon? Vous ne pouvez pas surcharger les méthodes par leur type de retour (sauf si enable_if est mis en œuvre comme une construction du langage plutôt que par, que je suis actuellement en supposant, une simple basé sur un modèle de classe).
  • Pourquoi la solution de faire enable_if dépendent de T nécessaire, exactement?
  • La solution ne fonctionne pas pour moi! J'ai eu error: no matching function for call ...
  • Ma Solution? C'est pourquoi vous downvoted la question? Je posais une question ici. Pour les réponses regarder ci-dessous.
  • Le sizeof(T) ne fonctionne pas dans mon cas. Désolé pour le downvote. J'étais juste frustrés alors. J'ai utilisé le modèle par défaut de l'argument en C++11.