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?
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;
}
}
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);
// ...
}
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.