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

136,855

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);
    // ...
}
Share:
136,855
Marconius
Author by

Marconius

Updated on December 11, 2021

Comments

  • Marconius
    Marconius over 2 years

    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?