功能模板和无效

时间:2013-10-08 08:48:11

标签: c++ templates c++11

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

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

1 个答案:

答案 0 :(得分:4)

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

尽管如此,问题是bar会返回void,这意味着Hook的{​​{1}}的模板参数会推断为T。然后,对于void的默认参数,您尝试创建类型为def的对象。那当然是非法的。

您必须为void函数提供Hook的特化(或更好,重载):

void