c++ - 前向声明和模板实例化上下文

标签 c++ templates

我有一个 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/

相关文章:

c++ - 具有模板的构造函数特化

python - 从 Keras 保存初始化的 tensorflow 图

c++ - 错误 : wrong number of template arguments (0, 应该是 1)

c++ - 痛苦缓慢的迷宫制作程序

c++ - 一元按位或折叠位集构造函数

c++ - 定义外联成员模板函数

javascript - JSON 在我的 JavaScript 中被全局修改...为什么?

c++ - 在模板类中使用 r 和 l 值构造函数时出错

C++ 根据其他信息排序索引

c++ - 为什么 __weak 属性需要运行时支持