Как исправить эту ошибку компиляции: «неявное создание неопределенного шаблона»? - PullRequest
0 голосов
/ 23 января 2019

Я пытаюсь изучить некоторые веб-сборки, и все вызовы асинхронны.Мне нужно знать, когда асинхронный вызов закончен.Например, функция emscripten_async_wget принимает 2 обратных вызова (onLoad и onError) в качестве второго и третьего аргумента.Оба обратных вызова имеют одинаковую подпись: typedef void (*em_str_callback_func)(const char *); Я хотел бы передать больше, как будущее, чтобы знать, когда оно закончится.

Проблема в том, что у меня есть ошибка в моем коде шаблона.Я считаю, что это потому, что лямбда не создает действительный экземпляр шаблона.


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 <(лямбда в ./src/main.cpp:428: 19)> 'std :: function m_onLoad;

. / Src / main.cpp: 439: 25: note: при создании шаблона класса' AsyncCall <(лямбда в ./src/main.cpp:428: 19), (лямбда в ./src/main.cpp:432:20)> 'здесь запрошено auto asyncCallObj = make_AsyncCall (onLoad, onError);

. / Src / main.cpp: 356:8: примечание: здесь объявлен шаблон struct callback_traits;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...