Salut à tous !
J'essaye de porter un projet c++ 14 code::block et GCC depuis Windows vers linux. Le projet marchait très bien sur windows mais en passant par linux, patatras!
OS de départ : Windows 7 Professional
Compilateur : TDM GCC 5.1 (avec -std c++14)
Code::Blocks : version 10.5 (je crois).
OS d'arrivée : Ubuntu 12.04
Compilateur : GCC 5.2.1 (avec -std c++14)
Code::Blocks : version 10.5.2.
J'ai réduit mon code à sa plus simple expression. Je suis censé avoir un warning du type -Wnarrowing :
Or j'obtiens le log suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 #include<vector> template<typename T> struct Array { std::vector<long> shape; Array(const std::vector<T> & data) : shape({data.size()}) {} // <-- -Wnarrowing ici }; int main(){ Array<long> a({1L,2L,3L,4L,5L}); return 0; };J'obtiens bien le warning (en double : je ne sais pas pourquoi) mais en plus le required from here qui indique l'appel dans le main devient une erreur !? Et du coup ça ne compile pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 -------------- Build: Debug in APL --------------- Compiling: main.cpp /home/tchebychev/APL/main.cpp: In instantiation of ‘Array<T>::Array(const std::vector<T>&) [with T = long int]’: /home/tchebychev/APL/main.cpp:13:33: required from here /home/tchebychev/APL/main.cpp:7:61: warning: narrowing conversion of ‘(& data)->std::vector<_Tp, _Alloc>::size<long int, std::allocator<long int> >()’ from ‘std::vector<long int>::size_type {aka unsigned int}’ to ‘long int’ inside { } [-Wnarrowing] Array(const std::vector<T> & data) : shape({data.size()}) {} // Given data only : assuming 1-D vector ^ /home/tchebychev/APL/main.cpp:7:61: warning: narrowing conversion of ‘(& data)->std::vector<_Tp, _Alloc>::size<long int, std::allocator<long int> >()’ from ‘std::vector<long int>::size_type {aka unsigned int}’ to ‘long int’ inside { } [-Wnarrowing] Linking console executable: bin/Debug/APL Output size is 41,04 KB Process terminated with status 0 (0 minutes, 0 seconds) 1 errors, 2 warnings
Notes :
- Si le warning est levé dans le main, tout baigne. Exemple : le code suivant compile :
(En faisant un rebuild, car si je fais build and run, j'ai un autre problème : le build du log s'efface à l'exécution
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 #include<vector> int main(){ std::vector<long> a({1L,2L,3L,4L,5L}); std::vector<long> b({a.size()}); // <-- -Wnarrowing ici (encore en double et je ne sais toujours pas pourquoi) return 0; };)
- Je compile sans flag à part le std=c++14 rajouté dans other options (enfin je crois : j'ai décoché toutes les cases dans compiler settings., contrairement à Windows le log n'affiche pas la commande complète au début du log :
C'était pourtant bien pratique
Code : Sélectionner tout - Visualiser dans une fenêtre à part g++ -std=c++14 ...
).
Mettre std=c++11 génère la même erreur. Par contre, si je rajoute -w pour taire les warnings, là ça marche.
Auriez-vous des idées ? Pensez-vous que c'est lié à Code::blocks ? ou à GCC ? ou bien à moi ce qui est probable aussi!
Bon week-end !
Jean
Partager