在'('标记之前)的预期构造函数,析构函数或类型转换

时间:2012-01-22 00:43:00

标签: c++ class constructor

编译polygone.hpolygone.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 个答案:

答案 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::stringstring的类型不同,因此声明的签名与定义的签名不同,并且该消息被吐出。

作为旁注,如果编译器寻找几乎匹配的构造函数签名,并且在发现一个暗示参数不匹配而不是给出此消息的情况下,那就太好了。