Warum enable_if_t in template-Argumente beschwert sich über neudefinitionen?

Ich habe folgenden Fall, der arbeitet mit std::enable_if :

template<typename T,
         typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }

template<typename T,
         typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }

Nun, ich sah in cppreference die neue syntax, viel sauberer meiner Meinung nach : typename = std::enable_if_t<std::is_same<int, T>::value>>

Ich wollte mein port code :

template<typename T,
         typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }

template<typename T,
         typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }

Aber jetzt GCC (5.2) beklagt :

error: redefinition of 'template<class T, class> void g()'
       void g() { }

Warum ist das so ? Was kann ich tun, um die neue, prägnante syntax, in diesem Fall, ob das möglich ist ?

  • Ihre zweite code verwendet Standard-template-Argumente. Sie sind nicht Teil der Funktionssignatur, damit Sie deklarieren zwei Funktions-templates mit der gleichen Signatur = Neudefinition. Die entsprechende Verwendung von enable_if_t ist buchstäblich std::enable_if_t<std::is_same<int, T>::value>* = nullptr.
  • Gut, Sie wusste nicht, schreiben Sie Ihre original-code genau. Sie vergaß die * = nullptr.
  • Sie können fügen Sie eine dummy-template-parameter, um eine der Erklärungen, wie , typename = void nach enable_if
  • Ich denke, Sie können Ihren Kommentar als Antwort ! @KerrekSB: Nein, das ist der Punkt, der enable_if_t @PiotrS. : ok
  • Wahrscheinlich ein Duplikat von: stackoverflow.com/q/15427667 oder stackoverflow.com/q/28674543 oder stackoverflow.com/q/8743159
  • Ich ging die typename std::enable_if_t<std::is_same<int, T>::value>* = nullptr route. 4 Zeichen gewonnen, naja :p
  • Sie brauchen nicht die typename vor std::enable_if_t. Mehr Zeichen gewonnen.
  • Noch mehr Zeichen an std::enable_if_t<std::is_same<int, T>::value, int> = 0 oder std::enable_if_t<std::is_same_v<int, T>, int> = 0.
  • Gerade versucht, aber mein compiler (gcc 4.9) beschwert sich mit *=0 und nicht mit *=nullptr.
  • Das ist, warum ich nicht sagen *=0. Ich lieferte int als zweites argument enable_if_t anstelle der Standard -void, so 0 ist ein integer-literal, nicht ein null-Zeiger-literal.
  • Ich sollte lernen zu Lesen.

Schreibe einen Kommentar