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 :
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;
};
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
-------------- 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
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

Notes :
  • Si le warning est levé dans le main, tout baigne. Exemple : le code suivant compile :
    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;
    };
    (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 )
  • 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 ).
    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