1. ホーム
  2. c++

[解決済み】コンストラクタ、デストラクタ、または'('トークン)の前に型変換を期待する

2022-02-17 19:21:20

質問

コンパイル 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) をコンストラクタとして使用することができますが、実際にそうだとすると、その理由は全く分かりません。

何か参考になることはありますか?

解決方法は?

ヘッダーの最初のコンストラクタは、セミコロンで終わらせてはいけません。 #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 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;
  }
}