5
votes

Pourquoi std :: size () n'est pas membre de std dans gcc 8.2.0

J'essaye de m'apprendre un peu de C ++ 17.

Pourquoi le compilateur lance-t-il une erreur pour l'extrait de code ci-dessous?

manish@Manish-Tummala:~/c_files$ g++ 6.cpp -o - 6.out
6.cpp: In function ‘int main()’:
6.cpp:8:23: error: ‘size’ is not a member of ‘std’
     std::cout << std::size(v) << '\n';
                       ^~~~
6.cpp:8:23: note: suggested alternative: ‘size_t’
     std::cout << std::size(v) << '\n';
                       ^~~~
                       size_t
6.cpp:11:23: error: ‘size’ is not a member of ‘std’
     std::cout << std::size(a) << '\n';
                       ^~~~
6.cpp:11:23: note: suggested alternative: ‘size_t’
     std::cout << std::size(a) << '\n';
                       ^~~~
                       size_t

Le compilateur lance l'erreur suivante

#include <iostream> 
#include <vector>
#include <iterator>

int main() 
{
    std::vector<int> v = { 3, 1, 4 };
    std::cout << std::size(v) << '\n'; 

    int a[] = { -5, 10, 15 };
    std::cout << std::size(a) << '\n';
}


3 commentaires

Vous avez besoin de l'indicateur -std = c ++ 17 pour indiquer au compilateur d'utiliser C ++ 17. Sinon, vous pouvez faire a.size ()


@Mirko a.size () ne fonctionnera pas car a est un tableau brut int [] . std :: array devrait être utilisé à la place


@RemyLebeau True dat. Il peut toujours faire v.size () et sizeof (a) / sizeof (a [0])


3 Réponses :


6
votes

Pour la prise en charge de C ++ 17 dans GCC, veuillez vous référer à:

Pour le moment, le support C ++ 17 n'est pas activé par défaut:

Pour activer la prise en charge de C ++ 17, ajoutez le paramètre de ligne de commande -std = c ++ 17 à votre ligne de commande g ++ . Ou, pour activer les extensions GNU en plus des fonctionnalités C ++ 17, ajoutez -std = gnu ++ 17 .

Pour le moment, l'ABI C ++ 17 pour GCC n'est pas encore finalisé. Cela signifie que les programmes construits aujourd'hui en mode C ++ 17 peuvent ne pas être capables de se lier à des binaires passés ou futurs également compilés en mode C ++ 17 (ou se bloquer lors de l'exécution). Une ABI stable garantit une telle interopérabilité entre les versions du compilateur.

Une fois l'ABI définitive, une future version de GCC activera le mode C ++ 17 par défaut.


0 commentaires

1
votes

Votre installation g ++ doit être à la version 6 ou supérieure. Vous pouvez le vérifier avec

g++ -std=gnu++17 6.cpp -o 6.out

Si votre version g ++ est suffisamment élevée. Vous devez également l'exécuter avec l'option de ligne de commande c ++ 17.

g++ -std=c++17 6.cpp -o 6.out

ou

g++ -v


0 commentaires

0
votes

Pour VSCode: ajouter une référence explicite à C ++ 17 serait utile, ce qui peut être fait en modifiant le fichier tasks.json dans le dossier

  "args": [
           "-std=c++17",
           "${file}",
            "-o",
            "${fileDirname}\\${fileBasenameNoExtension}.exe"
        ]


0 commentaires