comment fonctionne rbegin(),rend(),cbegin(),cend()

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonsoir à tous, je ne parviens pas a utiliser les méthodes cend(),cbegin(),rend(),rbegin(). Mon compilo m'indique que ces methodes ne sont pas définies dans la portée.J'ai pourtant essayer d'include vector et algorithm. Par exemple:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
int main() {

  const std::string s { "azerty" };
  std::string s1 {"......"};

  std::copy(cbegin(s),cend(s),begin(s1));
  std::cout << s1 << std::endl;
}

ce code ne fonctionne pas. Je compile en C++14 et j'utilise Clion. Merci beaucoup de vos conseils et idées de solutions.

+0 -0

J'ai réalisé que j'avais fait cette erreur pas mal de fois. Mais ce code compile sur Coliru (tous mes codes sont testé dessus). Du coup, il fallait que je vérifie s'il y avait effectivement des fonctions libres hors std ou s'il y avait un problème.

Dans le doute, mettre std:: est plus sur.

+0 -0

Tu as oublié std:: devant.

informaticienzero

Ce n'est pas std:: qui manque, mais des using ....

Explication: http://jonathanpoelen.blogspot.fr/2013/07/utilisation-de-swap-et-des-fonctions.html

Sans using: http://jonathanpoelen.blogspot.fr/2015/05/delegation-dappel-de-fonctions.html

@GouleFutée: Avec l'en-tête <iterator> ? La libc++ de clang est beaucoup plus strict que celle de gcc (comprendre que l'entête peut être inclut à travers <string>).

+0 -0
Auteur du sujet

je ne crois pas que j'utilise clang car lorsque je tente de faire clang++ -v, mon terminal me dit : commande inconnu. De plus, je ne comprends pas vraiment la solution de jo_link_noir. Je dois importer manuellement cbegin?

Édité par GouleFutée

+0 -0

Je ne sais pas pourquoi j'avais lu que tu bossais sur Mac. Mais ce n'est peut être pas le cas en fait :(

Je ne connais pas Clion, il faut voir dans les options quel compilateur est utilisé. Ou dans les log de sortie. Ensuite, avec "-v" ou "–version" pour savoir la version

+0 -0
Auteur du sujet

Je vais vous donner mon CMakeList et mes logs:

1
2
3
4
5
6
7
cmake_minimum_required(VERSION 3.3)
project(langageLearning)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")

set(SOURCE_FILES Sources/main.cpp)
add_executable(langageLearning ${SOURCE_FILES})

mon CMakeList.txt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
/home/white/workspace/clion-1.2.4/bin/cmake/bin/cmake --build /home/white/.CLion12/system/cmake/generated/ee5b522e/ee5b522e/Debug --target langageLearning -- -j 4
Scanning dependencies of target langageLearning
[ 50%] Building CXX object CMakeFiles/langageLearning.dir/Sources/main.cpp.o
/home/white/workspace/langageLearning/Sources/main.cpp: In function int main():
/home/white/workspace/langageLearning/Sources/main.cpp:13:16: error: cbegin was not declared in this scope
   copy(cbegin(s),cend(s),begin(s1));
                ^
/home/white/workspace/langageLearning/Sources/main.cpp:13:24: error: cend was not declared in this scope
   copy(cbegin(s),cend(s),begin(s1));
                        ^
CMakeFiles/langageLearning.dir/build.make:62: recipe for target 'CMakeFiles/langageLearning.dir/Sources/main.cpp.o' failed
make[3]: *** [CMakeFiles/langageLearning.dir/Sources/main.cpp.o] Error 1
CMakeFiles/Makefile2:67: recipe for target 'CMakeFiles/langageLearning.dir/all' failed
make[2]: *** [CMakeFiles/langageLearning.dir/all] Error 2
CMakeFiles/Makefile2:79: recipe for target 'CMakeFiles/langageLearning.dir/rule' failed
make[1]: *** [CMakeFiles/langageLearning.dir/rule] Error 2
Makefile:118: recipe for target 'langageLearning' failed
make: *** [langageLearning] Error 2

mes logs de compilation

Et de plus j'utilise G++

Édité par GouleFutée

+0 -0
Auteur du sujet

voila ^^:

1
2
3
4
5
6
7
Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.9/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Debian 4.9.2-10' --with-bugurl=file:///usr/share/doc/gcc-4.9/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.9 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.9 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-vtable-verify --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.9-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.9-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --with-arch-32=i586 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.9.2 (Debian 4.9.2-10) 
+0 -0

Cette réponse a aidé l'auteur du sujet

Je viens en effet de tester sur Coliru, avec g++ (5.3 par défaut) cela compile sans problème. Mais avec g++ 4.9 (sur Coliru aussi), cela produit des erreurs.

Du coup, cela provient d'un support incomplet de C++14 par GCC 4.9 (cette version est complète pour le C++11, mais pas pour C++14. Je crois que c'est GCC 5 au minimum pour le C++14).

La solution est d'utiliser les fonctions membres plutôt que les fonctions libres.

1
2
begin(s)  // fonction libre
s.begin() // fonction membre

(cf http://guillaume.belz.free.fr/doku.php?id=collection )

EDIT : j'ai ajouté une note dans http://guillaume.belz.free.fr/doku.php?id=iterateurs

Édité par gbdivers

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte