Warum kompiliert dies nicht mit gcc48 und clang32?Warum kompilieren Fehler mit 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 Fehler:
/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 Fehler:
/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 - LÖSUNG
ich Antwort von Charles Salvia, aber aus praktischen Gründen nicht angenommen habe ich konnte die vorgeschlagene Problemumgehung (spezialisiert auf N) nicht verwenden. Ich habe eine andere Problemumgehung gefunden, die für mich funktioniert. Machen enable_if
hängen von T
:
typename std::enable_if<(sizeof(T),N==1), int>::type
Sind Sie sicher, dass dies sowieso funktionieren wird? Sie können Methoden nicht einfach über ihren Rückgabetyp überladen (es sei denn, 'enable_if' ist als Sprachkonstrukt implementiert und nicht, wie ich derzeit annahm, eine einfache Template-Klasse). – zneak
Warum ist die Problemumgehung, enable_if von T abhängig zu machen, genau notwendig? –
Die Lösung funktioniert nicht für mich! Ich habe 'Fehler: keine passende Funktion für Anruf ...' –