1

別の関数を使用して、ファイルからいくつかのデータ値を読み取ろうとしています。2 つのエラーが発生します (長い間 C++ を使用していません...):

double * FREAD(std::string fpath){
std::string line;
double * params = new double[14];


std::ifstream parameters (fpath);
if (parameters.is_open())
{
    for (int b = 0; b < 14; b++) {
        parameters >> line >> params[b];

    }
}
    parameters.close();



return params;

}

スロー

error C2556: 'double *FREAD(std::string)' : オーバーロードされた関数は、'double FREAD(std::string)' と戻り値の型のみが異なります

エラー C2040: 'FREAD' : 'double *(std::string)' は間接参照のレベルが 'double (std::string)' と異なります

2 番目の問題は、main で関数を呼び出す行からスローされます。

double * param = FREAD(parampath);

エラー C2440: '初期化中': 'double' から 'double *' に変換できません

double が指す値として param を定義しないと、逆に同じ型の不一致エラーが発生します...

私の理解では、サブ関数が作成した配列の最初の値を指すポインターを返し、それを使用してデータを操作する必要があるということです。しかし、メインで関数を呼び出すと、この値を取得できないようです。

4

2 に答える 2

6

それを行うための最も簡単で確実な方法は、コンテナを返すことです。たとえば、

#include <array>

std::array<double,14> FREAD(const std::string& fpath)
{
  std::string line;
  std::array<double, 14> params;
  // .... fill params
  return params;
}

オーバーロード エラーに関しては、戻り値の型で関数をオーバーロードすることはできません。コンパイラは次の 2 つの宣言を見ているようです。

double * FREAD(std::string fpath);
double FREAD(std::string fpath);

上記の提案を考えると、とにかく両方を削除する必要があります。

于 2013-10-26T19:48:11.723 に答える
1

あなたerror C2556は明らかに何か他のものを返す別の FREAD() 関数を持っているからです。エラーは、戻り値の型のみに基づいて関数をオーバーロードできないことを示しています。

メッセージを見ると、次の 2 つの機能があるように見えます。

  • double * FREAD(std::string fpath)
  • double FREAD(std::string fpath)

投稿したのは最初の 1 つだけです。

constC++ では、異なる引数 (またはメンバー関数の場合は -ness)を取る場合にのみ、同じ名前の 2 つの関数を使用できます。関数に別の名前を付けるか、コンパイラが必要な名前を伝えるために使用できるトークン引数を渡す必要があります。

于 2013-10-26T19:51:49.393 に答える