我遇到了以下错误
min.cpp:17:30: error: no viable conversion from '<overloaded function type>' to 'Container::UnaryFun' (aka 'function<double (double)>')
this->addFunction("abs", abs);
当尝试编译以下代码时:
#include <cmath>
#include <string>
#include <functional>
class Test
{
public:
using UnaryFun = std::function<double (double)>;
Test()
{
this->addFunction("abs", abs);
}
auto addFunction(const std::string& name, UnaryFun fun) -> void
{
// ...
}
};
auto main() -> int {
Test eval;
return 0;
}
我已经尝试检查 std::abs
的声明,对于参数 double
和返回类型 double
,看起来像这样:
inline _LIBCPP_INLINE_VISIBILITY double abs(double __lcpp_x) _NOEXCEPT {
return __builtin_fabs(__lcpp_x);
}
在 /usr/local/Cellar/llvm/15.0.7_1/include/c++/v1/stdlib.h
中。
它仅适用于 double
类型。我已经通过添加以下内容进行了检查:
double a = 5;
double b = std::abs(a);
这段代码可以顺利编译,没有任何转换警告。
我尝试声明自己的abs
函数,像这样:
inline double xabs(double val)
{
return val < 0 ? -val : val;
}
然后将以下代码更改为使用这个新的xabs
而不是std::abs
this->addFunction("abs", xabs);
在这个更改之后,代码可以编译。
有任何想法为什么使用 std::abs
的代码无法编译?
我的环境:
操作系统:Mac OS 12.6
编译器:
Apple clang version 14.0.0 (clang-1400.0.29.202)
Target: x86_64-apple-darwin21.6.0
Thread model: posix
InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin
编译命令:g++ -std=c++2a -o min min.cpp
基于评论的更新
我深入挖掘了一下,似乎是std::function
的声明方式有问题,导致了上述问题。
如果我这样声明addFunction
,不使用std::function
,问题就消失了。
auto addFunction(const std::string& name, double (*fun)(double)) -> void
{
}
这意味着编译器无法在使用
std::function
时找到匹配的abs
,但如果直接描述函数的类型而不使用std::function
,它可以识别到匹配的重载版本。
static_cast<>()
来指定根据函数指针类型所暗示的函数签名使用哪个[重载]”。您是否因为答案没有涵盖所有可能的指定转换的方式而感到困惑? - JaMiTstd::function
不允许使用重载函数作为参数。 - RAllenstd::transform
示例需要函数指针而不是函数对象?,重载函数指针和为什么std::sort无法找到适当的(静态成员)函数重载?。 - JaMiT