ожидаемый конструктор, деструктор или преобразование типов перед токеном '(' - PullRequest
11 голосов
/ 22 января 2012

Компиляция polygone.h и polygone.cc выдает ошибку:

polygone.cc:5:19: error: expected constructor, destructor, or type conversion before ‘(’ token

Код:

//polygone.h
# if !defined(__POLYGONE_H__)
# define __POLYGONE_H__

# include <iostream>

class Polygone {

    public:
        Polygone(){};
        Polygone(std::string fichier);

};

# endif

и

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

Я предполагаю, что компилятор не распознает Polygone::Polygone(string nom) как конструктор, но, если это действительно так, я понятия не имею, почему.

Любая помощь?

Ответы [ 3 ]

6 голосов
/ 22 января 2012

Первый конструктор в заголовке не должен заканчиваться точкой с запятой.#include <string> отсутствует в шапке.string не соответствует std:: в файле .cpp.Это все простые синтаксические ошибки.Что еще более важно: вы не используете ссылки, когда вы должны.Также способ, которым вы используете ifstream, нарушен.Я предлагаю изучить C ++, прежде чем пытаться его использовать.

Давайте исправим это:

//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

и

//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;
  }
}
2 голосов
/ 26 января 2019

Это не только сценарий новичка. Я просто наткнулся на это сообщение компилятора (GCC 5.4) при рефакторинге класса для удаления некоторых параметров конструктора. Я забыл обновить и объявление, и определение, и компилятор выложил эту неинтуитивную ошибку.

Нижняя строка выглядит так: если компилятор не может сопоставить подпись определения с подписью объявления, он думает, что определение не является конструктором, а затем не знает, как анализировать код, и отображает эту ошибку. Что также произошло с OP: std::string не совпадает с типом string, поэтому подпись декларации отличалась от определения, и это сообщение было выложено.

В качестве примечания было бы неплохо, если бы компилятор искал почти совпадающие сигнатуры конструктора и, найдя один, предположил, что параметры не совпадают, а не выдает это сообщение.

2 голосов
/ 22 января 2012

Вам не хватает ссылки на пространство имен std в файле cc.Вы также должны вызвать nom.c_str(), потому что не существует неявного преобразования из std::string в const char *, ожидаемого конструктором ifstream.

Polygone::Polygone(std::string nom) {
    std::ifstream fichier (nom.c_str(), std::ifstream::in);
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...