【发布时间】:2014-10-24 19:40:08
【问题描述】:
我正在尝试使用 C++11 定义一个可以存储多个 std::function<> 的类,并根据它们的参数类型调用它们,类似于重载解析。
我为“重载”函数应该支持的每个函数签名声明一个基类:
template <typename R, typename... A>
struct overload;
template <typename R, typename... A>
struct overload<R(A...)>
{
typedef std::function<R(A...)> F;
F f_;
overload(F f): f_(f) {}
R operator()(A... a)
{
return f_(a...);
}
};
template <typename... T>
struct overloaded_function : public overload<T>...
{
overloaded_function(T... t): overload<T>(t)... {}
};
int main()
{
overloaded_function<void(float), void(int, int)> f([](float){}, [](int, int){});
f(1.F); // build error
f(2, 3); // build error
return 0;
}
构建错误:(Visual Studio 2013)
"overload::operator() [with R=void, A=]" 不明确 c:\Users\benj7280\Documents\kernel_builder\src\main.cpp 39 5 kernel_builder
我不明白运算符怎么会模棱两可,因为函数的签名完全不同。当我完全删除模板,只使用具体的类,以及用命名成员函数替换 operator() 重载时,错误完全相同。
【问题讨论】:
-
来自不同基类的同名成员函数不会重载。你需要
usings。 -
@T.C.该编辑可能会隐藏对 OP 的误解..
-
@dyp 够公平的。我会在评论中指出,
overload的主要模板应该只有一个没有包的参数。 -
@Kietz 解决方法:rextester.com/JPDXKV81915 我猜可能与在尾随返回类型中使用
this有关。
标签: c++ overloading ambiguous