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

前端 未结 3 499
抹茶落季
抹茶落季 2020-12-17 16:36

Compiling polygone.h and polygone.cc gives error:

polygone.cc:5:19: error: expected constructor, destructor, or type conversion bef         


        
相关标签:
3条回答
  • 2020-12-17 17:22

    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.

    0 讨论(0)
  • 2020-12-17 17:26

    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);
        // ...
    }
    
    0 讨论(0)
  • 2020-12-17 17:34

    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;
      }
    }
    
    0 讨论(0)
提交回复
热议问题