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.
Tu as oublié std::
devant.
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.
J y ai pensé aussi mais cela ne fonctionne pas… Je peux aussi essayer de compiler avec les mêmes flags que Coliru?
C'est quelle version de clang?
Je suppose que begin/end fonctionnent ?
Begin et end fonctionnent bien. Mais comment connaitre la version de clang? Il est mentionné dans le fichier cMake?
avec la commande "clang++ -v" par exemple
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?
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
Je vais vous donner mon CMakeList et mes logs:
| 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++
Donc "g++ -v" pour le numéro de version.
voila ^^:
| 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.
| 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
Super \o/ merci beaucoup^^. Je retourne me plonger dans ton tuto
Le std::
devant n'est pas nécessaire. Dites merci au Koenig/Argument-Dependant Lookup.
Dans une fonction générique, un using std::begin;
avant sera nécessaire pour supporter les tableaux statiques.
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