2017-01-03 5 views
3
#include <chrono> 

namespace X 
{ 
using namespace std; 
struct A 
{ 
    std::chrono::seconds d = 0s; // ok 
}; 
} 

namespace Y 
{ 
struct B 
{ 
    std::chrono::seconds d = 0s; // error 
}; 
} 

Die Fehlermeldung ist:Wie macht man [std :: operator "" s] in einem Namensraum sichtbar?

Fehler: kein passender Literaloperator zum Aufruf 'Operator "" s' mit Argumenten vom Typ 'unsigned long long' oder 'const char *', und keine passende literale Operatorvorlage Std :: Chrono :: Sekunden d = 0s;

Meine Frage ist:

Ich will nicht zu use namespace std; in namespace Y; wie sollte ich dann std::operator""s in namespace Y sichtbar machen?

Antwort

4

Wenn Sie alle chrono Literale haben wollen, dann können Sie

using namespace std::chrono_literals; 

verwenden Wenn Sie nur operator""s wollen, dann können Sie verwenden

using std::chrono_literals::operator""s; 

beachten Sie, dass zumindest auf coliru gcc Fragen ein Warnung für die obige Zeile, aber nicht klingeln. Für mich sollte es keine Warnung geben. Ich habe eine Follow-up-Frage dazu bei Should a using command issue a warning when using a reserved identifier?

+0

gefragt Ich denke, Sie brauchen 'mit Namespace ...;' für die erste, die zweite eine Warnung auf g ++. – Holt

+0

@Holt Ich denke, das ist ein GCC-Bug. Ja, es ist ein reservierter Name, aber wir definieren ihn nicht, benutzen ihn nur, damit es in Ordnung sein sollte. Ich habe nur eine Notiz darüber hinzugefügt, und dieser Klang warnt nicht. – NathanOliver

+0

Dies soll als 'using namespace std :: chrono_literals; 'verwendet werden. Der 'Literals ::' Teil ist redundant. –

Verwandte Themen