Perché questo non viene compilato con gcc48 e clang32? Errore diPerché compile errore con enable_if
#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: errore
/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:
/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 - SOLUZIONE
Ho accettato risposta da Charles Salvia, ma per motivi pratici I non è stato in grado di utilizzare la soluzione proposta (specializzarsi su N). Ho trovato altri rimedi che funzionano per me. Fai enable_if
dipendono T
:
typename std::enable_if<(sizeof(T),N==1), int>::type
Sei sicuro che questo sta andando a lavorare in ogni modo? Non è possibile sovraccaricare i metodi solo con il loro tipo di ritorno (a meno che 'enable_if' non sia implementato come un costrutto del linguaggio piuttosto che, come sto assumendo, una semplice classe basata su modelli). – zneak
Perché la soluzione alternativa per rendere enable_if dipende da T necessario, esattamente? –
La soluzione non funziona per me! Ho ottenuto 'errore: nessuna funzione di abbinamento per la chiamata ...' –