Ich schreibe momentan Überladungen arithmetischer Operatoren für Tupel. Der Operator iteriert über das Tupel, um die Operation an jedem einzelnen Element auszuführen. Hier ist die Definition für Operator + =:
%Vor%Leider kann GCC 4.6, wenn ich versuche den Operator anzurufen, nicht entscheiden, welche Überladung er verwenden soll. Zum Beispiel:
%Vor%Ergibt den folgenden Fehler:
%Vor% Was seltsam ist, da die Bedingung std::enable_if
den unangemessenen Anruf ablehnen sollte. Für den Moment habe ich die folgende Problemumgehung, die eigentlich meine vorherige Implementierung war. Die obige Version ist tatsächlich ein Vereinfachungsversuch.
Dies kompiliert und funktioniert wie erwartet. Warum verweigert die vereinfachte Version die Kompilierung? Danke.
Die Verwendung explizit angegebener Vorlagenargumente für eine Funktion oder Klassenvorlage erfordert, dass alle Vorlagenparameterpakete am Ende der Gesamtvorlagenparameterliste angezeigt werden. Wenn Sie Ts...
an das Ende der Vorlagenparameterlisten verschieben und die Aufrufe entsprechend ändern, funktioniert der Code. Abschnitt 14.8.2.1 von dem aktuellen C ++ 0x-Entwurf gibt an, dass Parameterpakete, die sich nicht am Ende der Vorlagenparameterliste befinden, nicht aus einem Funktionsaufruf abgeleitet werden können (wodurch der ursprüngliche Code fehlschlägt), aber das explizite Angeben aller Vorlagenargumente an operator+=
führt immer noch zu einem SFINAE Error. Eine vorherige Frage enthält einen Link zum genauen Text, der dies verbietet ; IBM-Dokumentation sagt, dass es auch ein Fehler ist.