【问题标题】:Function templates and void [closed]函数模板和 void [关闭]
【发布时间】:2013-10-15 02:29:42
【问题描述】:

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

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

【问题讨论】:

  • 你试图返回一个 void 值?
  • @Shaggi 是的,我能做到 - ideone.com/0835o2
  • 你遇到了什么错误?
  • catch 不重新抛出不是好兆头
  • @KarolyHorvath 这显然是一个简化的例子,我们不知道这些捕获的作用(但在这种情况下,他本来可以完全放弃异常的东西,但是很好)。

标签: c++ templates c++11


【解决方案1】:

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

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

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

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 (...)
    {

    }
};

【讨论】:

  • 你打败了我 ;-)
  • void 的情况下你还能return action() 吗?
  • @ChristianRau 可能不是,C&P 错误。已修复,谢谢。
  • @Angew 好吧,我不确定,这就是我问的原因。但从您的评论中,我推断您也不完全确定?
  • @ChristianRau:似乎合法:stackoverflow.com/questions/3383090/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
  • 2021-10-17
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
  • 2016-06-18
相关资源
最近更新 更多