编译器模板实现是否引入循环依赖?

时间:2013-02-05 21:25:25

标签: c++ templates generics c++11 circular-dependency

我正在使用C ++编写API,并尝试/真的/很难不使用RTTI(运行时类型信息)来实现一些依赖注入功能。

我相信我可以做到这一点,但通过使用模板 - 但它让我感到疑惑:

当模板被“扩展”并由编译器实现时,它们实际上引入了循环依赖(编译时或运行时),模板类是在框架库中实现的,以及它的客户端class是在上层的库中吗?

感谢您的帮助!

#include <string>

/************************************************************/
// Implemented in Framework.lib
namespace Framework 
{
    template<typename ShapeTemplateType>
    class Utility
    {           
        void Do()
        {
            ShapeTemplateType x;
            (void) x;
        }
    };
} // End namespace Framework 

/************************************************************/
// Implemented in Application.lib
namespace Application
{
    class StateObject
    {
        int i;
    };

    class Facade
    {
        Framework::Utility<StateObject> state;
    };
} // End Namespace Application


/********************************************************************/
// Implemented in Client
int main(int args, char* argv[])
{
    Application::Facade facade;

    //Derived d;
    return 0;
}

2 个答案:

答案 0 :(得分:3)

模板的代码在实例化的编译单元中生成。在您的示例中,生成的计算机代码将位于Application.lib

答案 1 :(得分:0)

您的意思是循环模板依赖关系,如:

template<class T>
using A = B<T>;

template<class T>
using B = A<T>;

int main()
{
    A<int>;
}

这在A的声明中失败,因为B不可用,如果你声明它抱怨它不完整。

我认为模板中可能没有循环依赖关系,因为必须为每个用于实例化的模板参数提供完整的类型。鉴于此,模板实例化链必须是非循环的。