我有一个 header ,它向前声明一个结构、一个函数,并定义一个使用结构具体类型的模板函数:
---header.h
struct RegisterImpl;
RegisterImpl& getRegisterImpl();
template <typename Interface>
void registerModuleClass( .... )
{
RegisterImpl& reg = getRegisterImpl();
reg.data = 3;
...
}
---源代码.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
类型被完全定义之后。但似乎代码的类型解析发生在模板定义存在的地方,而不是实例化(在源文件中)
我在这里遗漏了什么吗?这里的困境是模板函数需要使用实现的具体类型,但具体类型发生在源文件中。有什么办法解决这个问题吗?
最佳答案
我不确定这个建议是否对您的情况有帮助,但这里有一个想法:您可以将代码包装在一个需要 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;
希望对您有所帮助。
关于c++ - 前向声明和模板实例化上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15714780/