web-dev-qa-db-fra.com

conversion attendue du constructeur, du destructeur ou du type avant "(" jeton

La compilation de polygone.h et de polygone.cc donne une erreur:

polygone.cc:5:19: error: expected constructor, destructor, or type conversion before ‘(’ token

Code:

//polygone.h
# if !defined(__POLYGONE_H__)
# define __POLYGONE_H__

# include <iostream>

class Polygone {

    public:
        Polygone(){};
        Polygone(std::string fichier);

};

# endif

et 

//polygone.cc
# include <iostream>
# include <fstream>
# include "polygone.h"

Polygone::Polygone(string nom)
{
    std::ifstream fichier (nom, ios::in);
    std::string line;

    if (fichier.is_open())
    {
        while ( fichier.good() )
        {
            getline (fichier, line);
            std::cout << line << std::endl;
        }
    }
    else
    {
        std::cerr << "Erreur a l'ouverture du fichier" << std::endl;
    }
}

//ifstream fich1 (argv[1], ios::in);

Je suppose que le compilateur ne reconnaît pas Polygone::Polygone(string nom) en tant que constructeur, mais si tel est le cas, je ne sais pas pourquoi.

De l'aide?

8
Marconius

Le premier constructeur de l'en-tête ne doit pas se terminer par un point-virgule. #include <string> est manquant dans l'en-tête. string n'est pas qualifié avec std:: dans le fichier .cpp. Ce sont toutes des erreurs de syntaxe simples. Plus important encore: vous n'utilisez pas de références, alors que vous devriez le faire. La manière dont vous utilisez la variable ifstream est également interrompue. Je suggère d'apprendre le C++ avant d'essayer de l'utiliser. 

Réglons ceci:

//polygone.h
# if !defined(__POLYGONE_H__)
# define __POLYGONE_H__

#include <iostream>
#include <string>    

class Polygone {
public:
  // declarations have to end with a semicolon, definitions do not
  Polygone(){} // why would we needs this?
  Polygone(const std::string& fichier);
};

# endif

et

//polygone.cc
// no need to include things twice
#include "polygone.h"
#include <fstream>


Polygone::Polygone(const std::string& nom)
{
  std::ifstream fichier (nom, ios::in);


  if (fichier.is_open())
  {
    // keep the scope as tidy as possible
    std::string line;
    // getline returns the stream and streams convert to booleans
    while ( std::getline(fichier, line) )
    {
      std::cout << line << std::endl;
    }
  }
  else
  {
    std::cerr << "Erreur a l'ouverture du fichier" << std::endl;
  }
}
4
pmr

Il manque la référence à l'espace de noms std dans le fichier cc. Vous devez également appeler nom.c_str() car il n'y a pas de conversion implicite de std::string en const char * attendue par le constructeur de ifstream.

Polygone::Polygone(std::string nom) {
    std::ifstream fichier (nom.c_str(), std::ifstream::in);
    // ...
}
2
dasblinkenlight

Ce n'est pas seulement un scénario 'newbie'. Je viens de parcourir ce message du compilateur (GCC 5.4) lors de la refactorisation d'une classe pour supprimer certains paramètres du constructeur. J'ai oublié de mettre à jour la déclaration et la définition, et le compilateur a craché cette erreur peu intuitive. 

La ligne du bas semble être la suivante: si le compilateur ne peut pas faire correspondre la signature de la définition à celle de la déclaration, il pense que la définition n'est pas un constructeur et ne sait pas comment analyser le code et affiche cette erreur. C'est également ce qui s'est passé pour l'OP: std::string n'est pas du même type que string et la signature de la déclaration était donc différente de celle de la définition et ce message a été recraché. 

En remarque, ce serait bien si le compilateur recherchait des signatures de constructeurs presque identiques et, après en avoir trouvé un, laissait entendre que les paramètres ne correspondaient pas au lieu de donner ce message.

1
Bob Kocisko