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

Le problème exposé dans ce sujet a été résolu.

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.

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>).

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

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++

+0 -0

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) 

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

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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