编译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)
识别为构造函数,但是,如果确实如此,我不知道为什么。
任何帮助?
答案 0 :(得分:6)
标题中的第一个构造函数不应以分号结尾。标头中缺少#include <string>
。 {。1}}不符合.cpp文件中的string
。这些都是简单的语法错误。更重要的是:你应该在什么时候使用引用。你使用std::
的方式也被打破了。我建议在尝试使用之前学习C ++。
让我们解决这个问题:
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
答案 1 :(得分:2)
您缺少cc文件中的std命名空间引用。您还应该致电nom.c_str()
,因为std::string
的构造函数没有从const char *
到ifstream
的隐式转换。
Polygone::Polygone(std::string nom) {
std::ifstream fichier (nom.c_str(), std::ifstream::in);
// ...
}
答案 2 :(得分:2)
这不仅是“新手”场景。在重构类以删除一些构造函数参数时,我只是遇到了此编译器消息(GCC 5.4)。我忘了同时更新声明和定义,并且编译器吐出了这个不直观的错误。
底线似乎是这样的:如果编译器无法将定义的签名与声明的签名匹配,则认为该定义不是构造函数,因此不知道如何解析代码并显示此错误。这也是OP发生的情况:std::string
与string
的类型不同,因此声明的签名与定义的签名不同,并且该消息被吐出。
作为旁注,如果编译器寻找几乎匹配的构造函数签名,并且在发现一个暗示参数不匹配而不是给出此消息的情况下,那就太好了。