【问题标题】:"unresolved overloaded function type" with static function in std::function在 std::function 中带有静态函数的“未解析的重载函数类型”
【发布时间】:2015-10-28 10:48:55
【问题描述】:

我在尝试将重载静态函数传递给 std::function 时收到“未解决的重载函数类型”错误。

我知道类似的问题,例如thisthis。但是,即使那里的答案可以将正确函数的地址放入函数指针中,它们也会因std::function 而失败。这是我的 MWE:

#include <string>
#include <iostream>
#include <functional>

struct ClassA {
  static std::string DoCompress(const std::string& s) { return s; }
  static std::string DoCompress(const char* c, size_t s) { return std::string(c, s); }
};

void hello(std::function<std::string(const char*, size_t)> f) {
  std::string h = "hello";
  std::cout << f(h.data(), h.size()) << std::endl;
}

int main(int argc, char* argv[]) {
  std::string (*fff) (const char*, size_t) = &ClassA::DoCompress;
  hello(fff);
  hello(static_cast<std::string(const char*, size_t)>(&ClassA::DoCompress));
}

有人可以解释为什么 static_cast 在隐含的时候不起作用吗?

【问题讨论】:

  • "...什么时候隐含的呢?" 它编译没有错误,是因为无论涉及的类型如何,它都会强制转换。就像申请reinterpret_cast&lt;&gt;一样。
  • @πάντα ῥεῖ 没错,但就我而言,甚至reinterpret_cast 都没有工作。当然,知道我的错误是什么,原因就很明显了。 :)

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


【解决方案1】:

您不能强制转换为函数类型。您可能打算转换为 指针类型

hello(static_cast<std::string(*)(const char*, size_t)>(&ClassA::DoCompress));
//                           ^^^

【讨论】:

  • 我明白了,所以正确的答案是“因为我很愚蠢”。 :) 只是一个简短的后续问题:那么什么是函数类型?仅用作模板参数,例如std::function?
  • @DavidNemeskey 并用于创建指针和对它们的引用。例如。 using FuncType = double (int, char); FuncType *f = &amp;myFunc;
  • @DavidNemeskey 一个函数类型在some contexts 中有效,与元编程无关
猜你喜欢
  • 2012-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多