【问题标题】:Returning an array as a pointer将数组作为指针返回
【发布时间】:2013-10-26 19:44:24
【问题描述】:

我正在尝试使用单独的函数从文件中读取一些数据值;遇到两个错误(很久没用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;

}

抛出

错误 C2556: 'double *FREAD(std::string)' : 重载函数的不同之处仅在于返回类型与 'double FREAD(std::string)'

错误 C2040: 'FREAD' : 'double *(std::string)' 与 'double (std::string)' 的间接级别不同

第二个问题是从我在 main 中调用函数的那一行引发的。

double * param = FREAD(parampath);

错误 C2440:“正在初始化”:无法从“双”转换为“双 *”

如果我没有将 param 定义为 double 指向的值,我会在反向时得到相同的类型不匹配错误...

我的理解是我应该返回一个指针,该指针指向我的子函数创建的数组的第一个值,并使用它来处理数据。但是当我在 main 中调用该函数时,我似乎无法提取此值。

【问题讨论】:

  • 只需返回 std::vector&lt;double&gt;std::array&lt;double, 14&gt;
  • 该删除会在返回之后被调用吗?
  • @BobbyDigital 当然不是,但至少满足编译器,...
  • 您的 error C2556 是因为您显然还有另一个 FREAD() 函数返回其他内容。该错误告诉您不能仅根据返回类型重载函数。
  • @user1558168:您首先得到的错误是由于您的函数的声明和定义不同造成的。您使用double 返回类型(可能在头文件中的某处)声明它,然后使用double * 定义它。你没有发布声明,所以我们看不到它。这是你应该注意的。

标签: c++ arrays


【解决方案1】:

例如,最简单且万无一失的方法是返回一个容器

#include <array>

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

关于重载错误,您不能通过返回类型重载函数。看起来编译器看到了这两个声明:

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

鉴于上述建议,无论如何您都应该删除它们。

【讨论】:

    【解决方案2】:

    您的 error C2556 是因为您显然有另一个 FREAD() 函数返回其他内容。该错误告诉您不能仅根据返回类型重载函数。

    从消息来看,在我看来你有两个功能:

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

    你只发布了第一个。

    C++ 仅允许您拥有两个具有相同名称的函数,如果它们采用不同的参数(或 const-ness 用于成员函数)。您应该为您的函数指定不同的名称,或者传入一个标记参数,编译器可以使用该参数来判断您想要哪个。

    【讨论】:

    • 也可以。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    相关资源
    最近更新 更多