如何解决此编译错误:“未定义模板的隐式实例化”?

时间:2019-01-23 03:30:56

标签: c++ templates

我正在尝试学习一些Web程序集,并且所有调用都是异步的。我需要知道某个异步调用完成的时间。例如,函数emscripten_async_wget将2个回调(onLoad和onError)作为第二个参数和第三个参数。这两个回调具有相同的签名: typedef void (*em_str_callback_func)(const char *); 我想更像是一个未来,才能知道它什么时候结束。

问题是我的模板代码有错误。我相信是因为lambda没有实例化有效的模板实例。


template <typename Callback_t>
struct callback_traits;

template <typename Object_t, typename Return_t, typename... Arg_t>
struct callback_traits<Return_t (Object_t::*)(Arg_t...)> : public callback_traits<Return_t(Arg_t...)>
{
  using ObjectType = Object_t;
};

template <typename Return_t, typename... Arg_t>
struct callback_traits<Return_t (*)(Arg_t...)> : public callback_traits<Return_t(Arg_t...)>
{
};

template <typename Return_t, typename... Arg_t>
struct callback_traits<Return_t(Arg_t...)>
{
  using ReturnType = Return_t;
  using SignatureType = Return_t(Arg_t...);
  using PtrType = Return_t (*)(Arg_t...);
};

template <typename Return_t, typename... Arg_t>
struct callback_traits<std::function<Return_t(Arg_t...)>>
{
  using ReturnType = Return_t;
  using SignatureType = Return_t(Arg_t...);
  using PtrType = Return_t (*)(Arg_t...);
};
template <typename OnLoad_t, typename OnError_t>
class AsyncCall
{
  using OnLoadTraits = callback_traits<OnLoad_t>;
  using OnErrorTraits = callback_traits<OnError_t>;

public:
  AsyncCall(OnLoad_t onLoad, OnError_t onError)
  {
    m_future = m_promise.get_future();
    m_onLoad = [onLoad, &promise = m_promise](auto... args) {
      onLoad(std::forward<decltype(args)>(args)...);
      promise.set_value();
    };
  }

  void wait()
  {
    m_future.get();
  }

private:
  std::promise<void> m_promise;
  std::future<void> m_future;

  std::function<typename OnLoadTraits::SignatureType> m_onLoad;
};

template <typename OnLoad_t, typename OnError_t>
AsyncCall<OnLoad_t, OnError_t> make_AsyncCall(OnLoad_t onLoad, OnError_t onError)
{
  return AsyncCall<OnLoad_t, OnError_t>(std::forward<OnLoad_t>(onLoad), std::forward<OnError_t>(onError));
}

auto asyncCallObj = make_AsyncCall(onLoad, onError);

我试图找出我缺少的模板专业化。 我得到的错误是:

  

./ src / main.cpp:410:26:错误:未定义模板'callback_traits <(lambda at ./src/main.cpp:428:19)>的隐式实例化     std :: function m_onLoad;

     

./ src / main.cpp:439:25:注意:在实例化模板类'AsyncCall <(lambda at ./src/main.cpp:428:19),(lambda at ./src/main。 cpp:432:20)>'在这里请求       自动asyncCallObj = make_AsyncCall(onLoad,onError);

     

./ src / main.cpp:356:8:注意:模板在此处声明   struct callback_traits;

0 个答案:

没有答案