为什么我在以下代码中收到错误?我该如何解决?
#include <functional>
#include <iostream>
int foo()
{
std::cout << "::foo() \n";
return 0;
}
void bar()
{
std::cout << "::bar() \n";
}
template <typename T>
T Hook(const std::function<T()>& action, T def = T())
{
try
{
return action();
}
catch (const std::exception& ex)
{
}
catch (...)
{
}
return def;
};
int main()
{
std::function<int()> foo_func(foo);
Hook(foo_func);
std::function<void()> bar_func(bar);
// Hook(bar_func); // Error
}
答案 0 :(得分:4)
在询问编译器/链接器错误时,始终会在您的问题中包含错误。
尽管如此,问题是bar
会返回void
,这意味着Hook
的{{1}}的模板参数会推断为T
。然后,对于void
的默认参数,您尝试创建类型为def
的对象。那当然是非法的。
您必须为void
函数提供Hook
的特化(或更好,重载):
void