2017-09-05 1 views
0

Ich habe C++ - Programm zum Experimentieren von deprecated Schlüsselwort von C++ 17 erstellt.Attribut "veraltet" zu Namespace in C++ 17

Es funktioniert gut in Klirren (3.8.0), aber g ++ (5.4.0) gibt einen Fehler.

source_file.cpp:9:11: error: expected identifier before ‘[’ token 
namespace [[ deprecated ]] bar 
     ^
source_file.cpp:9:28: error: ‘bar’ does not name a type 
namespace [[ deprecated ]] bar 
          ^
source_file.cpp: In function ‘int main()’: 
source_file.cpp:16:5: error: ‘bar’ has not been declared 
    bar::var = 10; 

Warum?

#include <iostream> 
using namespace std; 

namespace foo 
{ 
    int var; 
} 

namespace [[ deprecated ]] bar 
{ 
    int var; 
} 

int main() 
{ 
    bar::var = 10; 
    return 0; 
} 
+1

Was ist der Fehler? Bist du sicher, dass 5.4 es bereits unterstützt? –

+1

Laut [this] (https://gcc.gnu.org/projects/cxx-status.html) wird es seit gcc 4.9 unterstützt. Und es ist für Namespaces erlaubt, von [dcl.attr.deprecated]: "Das Attribut kann auf die Deklaration einer Klasse, einen typedef-name, eine Variable, einen nicht statischen Datenmember, eine Funktion, einen Namespace, eine Enumeration, ein Enumerator oder eine Template-Spezialisierung. " – VTT

+0

Sie müssen auf g ++ 6.1 aufsteigen, und ab 8.0 wird immer noch gewarnt. – Arpegius

Antwort

0

Der Schlüssel ist in der Fehlermeldung: "erwartete Kennung vor [ Token". Die Kennung ist bar, und es muss vor[ erscheinen. Also:

namespace bar [[deprecated]] 
{ } 

Getestet mit GCC6.3