为什么我需要一个'模板'非依赖上下文中的关键字?

时间:2018-03-24 15:09:40

标签: c++ templates

我知道在依赖的上下文中调用模板的模板方法时,我需要一个template关键字。这对我来说很清楚。

现在,我有类似的事情:

#include <repository/RepositoryManager.hpp>
#include <events/Manager.hpp>
#include <memory>
#include <boost/di.hpp>

namespace di = boost::di;

inline std::shared_ptr<RepositoryManager> createRepositoryManager(int p) {
  (void)p;
  auto injector = di::make_injector(
      di::bind<events::Manager>().to<events::Manager>().in(di::singleton)
  );
  return injector.create<std::shared_ptr<RepositoryManager>>();
}

这可以按预期编译和工作,但我真正需要的是它是一个模板,只需改变这样的定义:

template <typename Param>
inline std::shared_ptr<RepositoryManager> createRepositoryManager(Param p)

给了我一堆错误:

In file included from x/main.cpp:7:0:
x/setup.hpp: In function ‘std::shared_ptr<RepositoryManager> createRepositoryManager(Param)’:
x/setup.hpp:19:53: error: expected primary-expression before ‘>’ token
       di::bind<events::Manager>().to<events::Manager>().in(di::singleton)
                                                     ^
x/setup.hpp:19:55: error: expected primary-expression before ‘)’ token
       di::bind<events::Manager>().to<events::Manager>().in(di::singleton)
                                                       ^
x/setup.hpp:21:59: error: expected primary-expression before ‘>’ token
   return injector.create<std::shared_ptr<RepositoryManager>>();
                                                           ^~
x/setup.hpp:21:62: error: expected primary-expression before ‘)’ token
   return injector.create<std::shared_ptr<RepositoryManager>>();
                                                              ^

我已经发现我可以改变这样的定义并且一切都很好:

template <typename Param>
inline std::shared_ptr<RepositoryManager> createRepositoryManager(Param p) {
  (void)p;
  auto injector = di::make_injector(
      di::bind<events::Manager>().template to<events::Manager>().in(di::singleton)
  );
  return injector.template create<std::shared_ptr<RepositoryManager>>();
}
但是,我想了解原因。 events::ManagerRepositoryManager是普通类(完整,不是模板)。除非有一些我不理解的有趣规则,否则我不会在这里看到我如何处于依赖的背景中。

哦,出于好奇,我已经尝试了下面的代码,它也编译了。我输了。

template <typename Param>
inline std::shared_ptr<RepositoryManager> createRepositoryManager(Param p) {
  (void)p;
  auto injector = di::make_injector();
  return injector.create<std::shared_ptr<RepositoryManager>>();
}

编辑:

它被标记为重复:Where and why do I have to put the "template" and "typename" keywords? 嗯,我在询问之前已经读过,但仍然无法解释我的情况(除非我真的错过了什么)。这里既没有使用模板参数类型,也没有使用参数值,所以我的理解是我在一个独立的上下文中,我应该能够很好地调用模板化方法。那我错在哪里?

0 个答案:

没有答案