web-dev-qa-db-ja.com

予期されるコンストラクタ、デストラクタ、または「(」トークンの前の型変換

_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)をコンストラクターとして認識していませんが、これが実際に当てはまる場合、その理由はわかりません。

何か助けは?

13
Marconius

ヘッダーの最初のコンストラクタはセミコロンで終わってはなりません。 #include <string>がヘッダーにありません。 stringは、.cppファイルでstd::で修飾されていません。これらはすべて単純な構文エラーです。さらに重要なことは、必要なときに参照を使用しないことです。また、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;
  }
}
5
pmr

これは「初心者」のシナリオだけではありません。クラスをリファクタリングしていくつかのコンストラクターパラメーターを削除するときに、このコンパイラーメッセージ(GCC 5.4)に遭遇しました。宣言と定義の両方を更新するのを忘れて、コンパイラがこの直感的でないエラーを吐き出しました。

一番下の行はこれのようです:コンパイラが定義のシグネチャを宣言のシグネチャに一致させることができない場合、コンパイラは定義がコンストラクタではないと見なし、コードを解析してこのエラーを表示する方法がわかりません。これは、OPで何が起こったのかです:std::stringstringと同じ型ではないため、宣言のシグネチャは定義のシグネチャと異なり、このメッセージは吐き出されました。

余談ですが、コンパイラがほぼ一致するコンストラクタのシグネチャを探し、それが見つかったときに、このメッセージを表示するのではなく、パラメータが一致しないことを示唆した場合は、いいでしょう。

4
Bob Kocisko

Ccファイルにstd名前空間参照がありません。 ifstreamのコンストラクターでは、_std::string_から_const char *_への暗黙的な変換が予期されていないため、nom.c_str()も呼び出す必要があります。

_Polygone::Polygone(std::string nom) {
    std::ifstream fichier (nom.c_str(), std::ifstream::in);
    // ...
}
_
2
dasblinkenlight