expected constructor, destructor, or type conversion before ‘(’ token
Solution 1
The first constructor in the header should not end with a semicolon. #include <string>
is missing in the header. string
is not qualified with std::
in the .cpp file. Those are all simple syntax errors. More importantly: you are not using references, when you should. Also the way you use the ifstream
is broken. I suggest learning C++ before trying to use it.
Let's fix this up:
//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
and
//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 tiny 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;
}
}
Solution 2
This is not only a 'newbie' scenario. I just ran across this compiler message (GCC 5.4) when refactoring a class to remove some constructor parameters. I forgot to update both the declaration and definition, and the compiler spit out this unintuitive error.
The bottom line seems to be this: If the compiler can't match the definition's signature to the declaration's signature it thinks the definition is not a constructor and then doesn't know how to parse the code and displays this error. Which is also what happened for the OP: std::string
is not the same type as string
so the declaration's signature differed from the definition's and this message was spit out.
As a side note, it would be nice if the compiler looked for almost-matching constructor signatures and upon finding one suggested that the parameters didn't match rather than giving this message.
Solution 3
You are missing the std namespace reference in the cc file. You should also call nom.c_str()
because there is no implicit conversion from std::string
to const char *
expected by ifstream
's constructor.
Polygone::Polygone(std::string nom) {
std::ifstream fichier (nom.c_str(), std::ifstream::in);
// ...
}
Marconius
Updated on December 11, 2021Comments
-
Marconius over 2 years
Compiling
polygone.h
andpolygone.cc
gives error: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
and
//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);
My guess is that the compiler is not recognising
Polygone::Polygone(string nom)
as a constructor, but, if this actually is the case, I have no idea why.Any help?