2017-09-05 2 views
0

J'ai créé le programme C++ pour expérimenter le mot-clé deprecated de C++ 17.Attribut "déprécié" à l'espace de noms en C++ 17

Il fonctionne très bien dans clang (3.8.0), mais, g ++ (5.4.0) donne une erreur.

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; 

Pourquoi?

#include <iostream> 
using namespace std; 

namespace foo 
{ 
    int var; 
} 

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

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

Quelle est l'erreur? Êtes-vous sûr que 5.4 le supporte déjà? –

+1

Selon [this] (https://gcc.gnu.org/projects/cxx-status.html), il est supporté depuis gcc 4.9. Et il est autorisé sur les espaces de noms, à partir de [dcl.attr.deprecated]: "L'attribut peut être appliqué à la déclaration d'une classe, un typedef-name, une variable, un membre de données non statique, une fonction, un espace de nom, une énumération, un énumérateur ou une spécialisation de modèle. " – VTT

+0

Vous devez vous lever à g ++ 6.1, et à partir de la version 8.0, c'est toujours un avertissement. – Arpegius

Répondre

0

L'indice est dans le message d'erreur: "attendu identifiant avant [ jeton". L'identificateur est bar, et il doit apparaître avant[. Alors:

namespace bar [[deprecated]] 
{ } 

testé avec GCC6.3