我有一个头向前声明一个struct,一个函数,并定义了一个使用struct具体类型的模板函数:
--- header.h
struct RegisterImpl;
RegisterImpl& getRegisterImpl();
template <typename Interface>
void registerModuleClass( .... )
{
RegisterImpl& reg = getRegisterImpl();
reg.data = 3;
...
}
--- source.cpp
struct RegisterImpl
{
int data;
};
RegisterImpl& getRegisterImpl()
{
static RegisterImpl instance;
return instance;
}
struct testiFace
{
virtual void Blah() = 0;
};
void useTemplate()
{
registerModuleClass<testiFace>(....);
}
我希望模板函数registerModuleClass
的实例化将在useTemplate
发生,这发生在RegisterImpl
类型完全定义之后。但似乎代码的类型解析发生在模板定义所在的位置,而不是实例化(在源文件中)
我在这里遗漏了什么吗?这里的困境是模板函数需要使用实现的具体类型,但具体类型发生在源文件中。有什么方法吗?
答案 0 :(得分:1)
我不确定这个建议是否会对您的情况有所帮助,但这里有一个想法:您可以将代码包装在需要RegisterImpl
作为模板参数的类模板中。
示例:
template<typename T>
struct Helper
{
T & getRegisterImpl()
{
static T instance;
return instance;
}
template<typename Interface>
void registerModuleClass()
{
T & reg = getRegisterImpl();
}
};
后来:
struct RegisterImpl
{
int data;
};
Helper<RegisterImpl> helper;
我希望这会有所帮助。
答案 1 :(得分:0)
使其取决于模板参数:
template<typename T, typename...> struct depend { typedef T type; };
template <typename Interface>
void registerModuleClass( .... )
{
typedef typename depend<RegisterImpl,Interface>::type LocalRegisterImpl;
LocalRegisterImpl& reg = getRegisterImpl();
reg.data = 3;
...
}