Ожидаемый конструктор, деструктор или преобразование типов перед '(токен
Компиляция 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)
как конструктор, но, если это действительно так, я понятия не имею, почему.
Любая помощь?
Ответы
Ответ 1
Первый конструктор в заголовке не должен заканчиваться точкой с запятой. #include <string>
отсутствует в заголовке. string
не соответствует std::
в файле .cpp. Все это простые синтаксические ошибки. Что еще более важно: вы не используете ссылки, когда хотите. Также нарушается способ использования ifstream
. Я предлагаю изучить С++, прежде чем пытаться его использовать.
Зафиксируем это:
//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
Это не только сценарий новичка. Я просто наткнулся на это сообщение компилятора (GCC 5.4) при рефакторинге класса для удаления некоторых параметров конструктора. Я забыл обновить и объявление, и определение, и компилятор выложил эту неинтуитивную ошибку.
Суть в следующем: если компилятор не может сопоставить сигнатуру определения с сигнатурой объявления, он думает, что определение не является конструктором, а затем не знает, как анализировать код, и отображает эту ошибку. Что также произошло с OP: std::string
не того же типа, что и string
поэтому подпись объявления отличалась от определения, и это сообщение было выложено.
В качестве примечания было бы неплохо, если бы компилятор искал почти совпадающие сигнатуры конструктора и, найдя один, предположил, что параметры не совпадают, а не выдает это сообщение.
Ответ 3
Вам не хватает ссылки на пространство имен std в файле cc. Вы также должны вызвать nom.c_str()
, потому что нет никакого неявного преобразования из std::string
в const char *
, ожидаемого конструктором ifstream
.
Polygone::Polygone(std::string nom) {
std::ifstream fichier (nom.c_str(), std::ifstream::in);
// ...
}