-7

为什么我在以下代码中出现错误?我该如何解决?

#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
}
4

1 回答 1

4

当询问编译器/链接器错误时,请始终在您的问题中包含错误。

然而,问题在于bar返回void,这意味着Hook's的模板参数T被推导出为void。然后,对于 的默认参数def,您正在尝试创建一个类型为 的对象void。这当然是违法的。

您必须提供Hookforvoid函数的专业化(或更好的重载):

template <typename T>
T Hook(const std::function<T()>& action, T def = T())
{
    try
    {
        return action();
    }
    catch (const std::exception& ex)
    {

    }
    catch (...)
    {

    }
    return def;
};


void Hook(const std::function<void()>& action)
{
    try
    {
        action();
    }
    catch (const std::exception& ex)
    {

    }
    catch (...)
    {

    }
};
于 2013-10-08T09:00:54.897 回答