-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テンプレート引数が と推定されることを意味します。そして、 のデフォルトの引数として、タイプ のオブジェクトを作成しようとしています。それはもちろん違法です。HookTvoiddefvoid

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 に答える