我知道在依赖的上下文中调用模板的模板方法时,我需要一个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::Manager
和RepositoryManager
是普通类(完整,不是模板)。除非有一些我不理解的有趣规则,否则我不会在这里看到我如何处于依赖的背景中。
哦,出于好奇,我已经尝试了下面的代码,它也编译了。我输了。
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? 嗯,我在询问之前已经读过,但仍然无法解释我的情况(除非我真的错过了什么)。这里既没有使用模板参数类型,也没有使用参数值,所以我的理解是我在一个独立的上下文中,我应该能够很好地调用模板化方法。那我错在哪里?