Ich stoße auf ein Problem in Bezug auf die angemessene Verwendung von enable_if und Template-Spezialisierung.Template-Spezialisierung und enable_if Probleme
Nach dem Beispiel Modifizieren (aus Gründen der Vertraulichkeit), ist hier ein vergleichbares Beispiel:
I have function called "less" that checks if 1st arg is less than 2nd arg. Let's say I want to have 2 different kinds of implementations depending on the type of input - 1 implementation for integer and another for double.
Der Code, den ich habe so sieht weit wie diese -
#include <type_traits>
#include <iostream>
template <class T,
class = typename std::enable_if<std::is_floating_point<T>::value>::type>
bool less(T a, T b) {
// ....
}
template <class T,
class = typename std::enable_if<std::is_integral<T>::value>::type>
bool less(T a, T b) {
// ....
}
int main() {
float a;
float b;
less(a,b);
return 0;
}
Der obige Code nicht kompiliert weil - Es sagt, dass ich die weniger Methode neu definiere.
Fehler sind:
Z.cpp:15:19: error: template parameter redefines default argument
class = typename std::enable_if<std::is_integral<T>::value>::type>
^
Z.cpp:9:19: note: previous default template argument defined here
class = typename std::enable_if<std::is_floating_point<T>::value>::type>
^
Z.cpp:16:11: error: redefinition of 'less'
bool less(T a, T b) {
^
Z.cpp:10:11: note: previous definition is here
bool less(T a, T b) {
^
Z.cpp:23:5: error: no matching function for call to 'less'
less(a,b);
^~~~
Z.cpp:15:43: note: candidate template ignored: disabled by 'enable_if'
[with T = float]
class = typename std::enable_if<std::is_integral<T>::value>::type>
^
3 errors generated.
Kann jemand darauf hinweisen, was der Fehler ist hier?
Im Wesentlichen verwenden Sie 'enable_if' nicht korrekt, da Sie den Rückgabetyp aufrufen. – Alex
Schnelle Lösung besteht darin, einen Ellipsenparameter '...' zu einem der Templates hinzuzufügen, so dass sie als unterschiedliche Überladungen betrachtet werden. – 0x499602D2
Oder ändern Sie die Signatur (en) in 'template :: Wert> :: type * = nullptr>' –
vsoftco