2015-05-06 11 views
6

ich einen benutzerdefinierten Datentyp haben, dass in der Praxis entweder float oder double sein kann. Auf jedem O außer OSX, ich bin in der Lage diese C++ 11-Vorlage erfolgreich bauen:Mehrdeutige Aufruf abs

#include <cmath> 
#include <cstdlib> 
#include <cstdint> 

template< class REAL_T > 
inline REAL_T inhouse_abs(REAL_T i_val) 
{ 
    return std::abs((REAL_T)i_val); 
} 

int main() 
{ 
    int32_t ui = 2; 
    inhouse_abs(ui); 
    return 0; 
} 

jedoch Klirren 6,0 (3,5 LLVM) berichtet, einen mehrdeutigen Funktionsaufruf. Wenn ich abs-fabs ändern, wird der Fehler auf OSX gelöst, aber jetzt ein identischen Fehler zeigt mich auf meinem Linux-Klirren, gcc, und Visual Studio.

Fehler auf Visual Studio mit Fabs:

349 error C2668: 'fabs' : ambiguous call to overloaded function 

UPDATE

Dieses Beispiel auf unserem O X-Systeme zusammengestellt, obwohl in dem fast identisch Projekt ist es nicht. Die Lösung enthielt <cstdlib> explizit in der Quelle, anstatt zurück in einem anderen Header. Der Grund ist unklar, scheint aber zu sein, dass xcode/clang nicht unserem Header entspricht.

+0

Haben Sie den eigentlichen Fehlertext haben? – Collin

+0

@Collin Der Visual Studio-Fehler wurde hinzugefügt. Braucht eine Minute, um das Klanganaloge zu finden. – EntangledLoops

+0

@ShafikYaghmour Der Fehler wird in dieser Zeile generiert, ohne dass Anrufe erforderlich sind. – EntangledLoops

Antwort

6

Das Problem ist, dass libc++ ist nicht ganz C++ 11 konform mit der integrierten Überlast für std::abs in cmath:

double  fabs(Integral arg); (7) (since C++11) 

einschließlich cstdlib Ihr Problem löst, da die Header-Überlastungen speziell für Integer-Typen hat.

Als Referenz der Entwurf C++ 11-Standard Abschnitt 26.8[c.math] Absatz 11 sagt:

Darüber hinaus soll es zusätzliche Überlastungen ausreichend sein, um sicherzustellen, dass:

und enthält die folgenden Artikel:

  1. Otherwis e, wenn irgendein Argument, das einem Doppelparameter entspricht, den Typ double oder einen Integer-Typ hat, dann werden alle Argumente, die Doppelparameter entsprechen, effektiv zu double umgewandelt.

Dies ist Situation sehr wahrscheinlich durch LWG active issue 2192: Validity and return type of std::abs(0u) is unclear ändern. Ich vermute, libc++ wählen nicht die Überlastungen in cmath aufgrund der Ausgabe in diesem Defekt Bericht gebracht zu liefern.

Siehe Is std::abs(0u) ill-formed? für weitere Details zu diesem Thema.

2

Die Lösung war explizit #include <cstdlib> auf der OS X-Maschine, wie aus irgendeinem Grund Visual Studio findet es in unseren Abhängigkeiten und enthält es, aber Clang nicht. Ich werde versuchen, eine ähnliche Kette von Includes, die unser Projekt hat, zu reproduzieren und den Fehler auf eine minimalistische Weise zu reproduzieren, da es immer noch ein Problem entweder mit Xcode oder Visual Studio sein kann.

+0

Hat mir in meinem Projekt geholfen, das auch in Xcode geschrieben wurde. Vielen Dank! – Fengson

+0

Froh, dass ich jemand anderen Zeit gerettet habe! – EntangledLoops