Undefined reference to... un objet non appelé

Undefined reference to... un objet non appelé - C++ - Programmation

Marsh Posté le 23-04-2018 à 21:06:17    

Bonjour,
 
Je teste actuellement le code C++ ci-dessous. Pour résumer, est implémentée une classe NeuralNetwork avec 4 attributs et 2 constructeurs, un par défaut et l'autre prenant un vector<int> en argument, et le main a pour seule utilité de tester le bon fonctionnement de ces constructeurs.  
 
Main :  

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cmath>
  4. #include <random>
  5. #include <ctime>
  6. #include <vector>
  7. #include "NeuralNetwork.h"
  8. int main(){
  9.     srand(time(NULL));
  10.     std::vector<int> sizes({1,2,3});
  11.     NeuralNetwork neurones();
  12.     NeuralNetwork neurones2(sizes);
  13.     return 0;
  14. }


 
NeuralNetwork.h :

Code :
  1. #include <iostream>
  2. #include <fstream>
  3. #include <cmath>
  4. #include <random>
  5. #include <ctime>
  6. #include <vector>
  7. class NeuralNetwork{
  8.     protected:
  9.         std::vector< int > sizes;
  10.         std::vector< std::vector< double > > neuronestates;
  11.         std::vector< std::vector< double > > B;
  12.         std::vector< std::vector< double > > Omega;
  13.     public:
  14.         NeuralNetwork(std::vector<int> sizes_init);
  15.         NeuralNetwork();
  16. };


 
NeuralNetwork.cpp :  

Code :
  1. #include "NeuralNetwork.h"
  2. NeuralNetwork::NeuralNetwork(std::vector<int> sizes_init){
  3.     sizes = sizes_init;
  4.     neuronestates = std::vector< std::vector< double > >(sizes.size());
  5.     for( int i=0;i<sizes.size();i++){
  6.         neuronestates[i] = std::vector < double > (sizes[i]);
  7.     }
  8.     Omega = std::vector< std::vector< double > >(sizes.size()-1);
  9.     for( int i=0;i<sizes.size()-1;i++){
  10.         Omega[i] = std::vector < double > (sizes[i]*sizes[i+1]);
  11.         for (int j=0;j<Omega[i].size();j++){Omega[i][j] = rand()/(double)RAND_MAX;}
  12.     }
  13.     B = std::vector< std::vector< double > >(sizes.size()-1);
  14.     for( int i=0;i<sizes.size()-1;i++){
  15.         B[i] = std::vector < double > (sizes[i+1]);
  16.         for (int j=0;j<B[i].size();j++){B[i][j] = rand()/(double)RAND_MAX;}
  17.     }
  18.     return;
  19. }
  20. NeuralNetwork::NeuralNetwork(){
  21.     sizes = std::vector<int>();
  22.     neuronestates = std::vector< std::vector< double > >();
  23.     Omega = std::vector< std::vector< double > >();
  24.     B = std::vector< std::vector< double > >();
  25.     return;
  26. }


 
Ce code échoue à la compilation, en me renvoyant "undefined reference to `NeuralNetwork::NeuralNetwork(std::vector<int, std::allocator<int> >". J'ai d'abord creusé sur le code en lui-même, sans vraiment trouver de solution, et ai fini par demander à un ami de repasser dessus. Hors, chez lui, le code compile et tourne sans souci. Après répétition de l'expérience chez quelqu'un d'autre, de nouveau le code fonctionne.
 
Le message d'erreur sous-entends que je fais appel à un objet que j'ai pourtant pas l'impression d'appeler (enfin... je ne vois pas ce que le std::allocator<int> vient faire ici), et le problème semble venir de mon poste. Est-ce que ça serait un des réglages du compilateur ou de l'IDE (j'utilise CodeBlocks sous Windows)? J'avoue ma totale incompétence sur ces sujets... Si quelqu'un a une idée de l'origine du problème, je suis preneur de tout conseil ou astuce!
 
Merci d'avance :)

Reply

Marsh Posté le 23-04-2018 à 21:06:17   

Reply

Marsh Posté le 24-04-2018 à 09:32:39    

Je pressens pas mal de warnings, tu as regardé ?
 
Et
    NeuralNetwork neurones();
C'est sensé faire quoi ?


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 24-04-2018 à 17:06:35    

TotalRecall a écrit :

Je pressens pas mal de warnings, tu as regardé ?
 
Et
    NeuralNetwork neurones();
C'est sensé faire quoi ?


 
Pas de warnings : le message d'erreur complet est  
Build file: "no target" in "no project" (compiler: unknown)
C:\[...]\TP3\test.o:test.cpp:(.text.startup+0xe4)      undefined reference to `NeuralNetwork::NeuralNetwork(std::vector<int, std::allocator<int> > )'
error: ld returned 1 exit status
Build failed: 2 error(s), 0 warning(s) (0 minute(s), 0 second(s))
 
Et la ligne "NeuralNetwork neurones();" est (normalement) un appel du constructeur par défaut. Ca n'est pas la bonne syntaxe?
 
Autre chose, découverte depuis hier soir, en copiant la totalité du code de NeuralNetwork.cpp dans le fichier principal, avant le main, ça compile sans problème. J'ai l'impression que l'IDE ne reconnait pas le fichier NeuralNetwork.cpp : si je déplace les deux fichiers hors du répertoire courant, j'ai un message d'erreur différent ("NeuralNetwork.hpp, no such file or directory" ), mais si je déplace simplement NeuralNetwork.cpp, c'est le message d'erreur initial qui apparait. Est-ce qu'il manquerait une option ou une directive de compilation ?
 

Reply

Marsh Posté le 24-04-2018 à 18:24:51    

>(compiler: unknown)  
Ça ça me paraît douteux, t'es sûr que c'est pas un problème de config de ton IDE? Tu peux compiler d'autres projets?

Reply

Marsh Posté le 24-04-2018 à 18:30:04    

Oui, c'est aussi l'impression que j'ai, que c'est au niveau du gestionnaire de projet qu'il y a problème.
 
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed