【问题标题】:Create a member function pointer to a function that returns std::pair创建一个指向返回 std::pair 的函数的成员函数指针
【发布时间】:2014-11-05 20:18:11
【问题描述】:

我想访问一个函数,该函数通过在运行时根据输入定义的指针返回一对。

示例代码:

int main() {
    struct Math::strinfo si; // This was what caused the problem - See answer and question edit

    typedef std::pair<double, string> (*FuncChosen)(struct strinfo *si, double first, double second);
    FuncChosen p = Math::calcSpeed;
}

calcSpeed 看起来像这样,位于命名空间“Math”中:

namespace Math {
    struct strinfo
    {
        string strformula;
        string chosenCalcStr;
    };

    std::pair<double, string> calcSpeed(struct strinfo *si, double distance, double time)
    {
        si->strformula = "Speed = distance / time";
        si->chosenCalcStr = "Speed";
        return make_pair(distance/time, std::to_string(distance) + " / " + std::to_string(time));
    }
}

我无法将 FuncChosen p 分配给 calcSpeed,因为它具有“std::pair 类型的左值”。 当 calcSpeed 返回一个 double 时,上面的代码运行良好 - 此方法是否与返回一对的函数不兼容,如果是,是否有任何解决方法不涉及将函数的返回类型从一对更改为其他类型?

我想在运行时分配指针的原因是,我可以选择是否使用 calcSpeed 或具有相同参数并根据输入返回类型的许多其他函数,并且在没有条件的情况下执行此操作的唯一方法是这样方法(我认为)。

提前致谢,

编辑: 完整的错误代码仅供参考:

SDT_Test/main.cpp:63:16: Cannot initialize a variable of type 'FuncChosen' (aka 'std::pair<double,   string> (*)(struct strinfo *, double, double)') with an lvalue of type 'std::pair<double, string> (struct strinfo *, double, double)': type mismatch at 1st parameter ('struct strinfo *' (aka 'strinfo *') vs 'struct strinfo *' (aka 'Math::strinfo *'))

编辑 2:

我忘记包含我的代码行,这会泄露问题。下面的答案显示问题出在 typedef 中的 'struct strinfo *si' - 应该是 'Math::strinfo *si'。

【问题讨论】:

  • 您是否缺少 std::string 成对的 std 命名空间?为什么不 typedef std::pair 也一样?
  • 我在程序顶部有'using std::string' - 你的第二个问题是什么意思?那是程序中返回错误的在线行。如果这有助于澄清问题,我会将完整的错误消息添加到问题中。
  • @exitc0de - 问题和答案的线索在错误消息中。第一个参数strInfo 有问题。
  • 我的意思是typedef std::pair&lt;double, string&gt; sometype; 然后使用sometype
  • 哇,我没有看到'第一个参数的类型不匹配('struct strinfo *''。抱歉 - 这是一个愚蠢的错误。感谢您的帮助 - 我在问题中澄清了但我直到您指出错误时才在错误中看到这一点(Xcode 使阅读完整的错误消息变得困难,当我设法将其粘贴到其中时,我没有阅读它)。再次抱歉,我很愚蠢。

标签: c++ pointers c++11 std-pair


【解决方案1】:

您在 typedef 中声明了一个名为 strinfo 的新类型

typedef std::pair<double, string> (*FuncChosen)(struct strinfo *si, double first, double second);
//                                              ^^^^^^^^^^^^^^^^ 
// that's a declaration of new type, not Math::strinfo

如果您在typedef 中省略了不必要的struct 关键字,错误就会很明显。改成

typedef std::pair<double, std::string> (*FuncChosen)(Math::strinfo *si, double first, double second);

或(恕我直言)更易读的版本

using FuncChosen = std::pair<double, std::string>(*)(Math::strinfo *si, double first, double second);

【讨论】:

  • 修复了它 - 更新了我做错了什么以及为什么我没有看到这一点的问题。很抱歉在 main 中的 typedef 之前省略了我程序的一个重要部分。 (见我的编辑)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多