expected constructor, destructor, or type conversion before ‘(’ token

Compiling polygone.h and polygone.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?

2

4 Answers

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.

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

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

You need the return type, for example "void Polygon..."

2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

You Might Also Like