【问题标题】:Cross source file template instantiation and use跨源文件模板实例化及使用
【发布时间】:2011-04-06 09:47:06
【问题描述】:

我有一个包含多个模板成员函数的类,我想将它们分布在多个源文件中以加快编译时间。 (模板是实现细节,不打算在类外使用,因此它们在源而不是标题中的定义。)

我将如何拆分这些模板,以免出现链接器错误?如果我有使用源文件 B 中定义的模板的源文件 A,我如何确保编译器构造了适当的模板实例?

【问题讨论】:

    标签: c++ templates distribution construction


    【解决方案1】:

    【讨论】:

    • export 几乎没有编译器实现,并且在 C++0x 中被弃用。它不应该用于新代码。
    • 啊,对不起,我的意思是链接到 35.15。但是,最好阅读从 35.13 开始的所有常见问题解答以便更好地理解。
    • @Billy: export 在 C++0x 中没有被弃用——它被完全删除了。由于只有一个编译器前端 (EDG) 实现了它,并且 EDG 人员要求将其删除,因此似乎没有太多理由推迟删除它。
    • @PanwenWang 谢谢,已修复!
    【解决方案2】:

    只是不要在头文件中将这些模板项声明为类的一部分。然后,仅在源文件中定义您的模板。例如:

    MyClass.hpp

    class MyClass
    {
    public:
        void SomePublicMethod() const;
    };
    

    MyClass.cpp

    template<class T>
    void SomethingWithT(T myVal)
    {
        // ...
    }
    
    void MyClass::SomePublicMethod() const
    {
        SomethingWithT(42);
    }
    

    【讨论】:

    • 不错的解决方法 :) 它可能看起来不那么优雅,因为它需要将成员方法(即使它们是私有的)移到类之外,然后传递 this 指针。在我看来,手动模板实例化是一种更简洁的方法。
    • @Billy: 如果我想要源文件 A 中的 SomethingWithT 和源文件 B 中的 SomePublicMethod 怎么办? (SomethingWithT 需要 long 时间来编译...)
    • @dark:除了没有已知的编译器实现手动模板实例化。是的,我同意这会更干净,但它依赖于 export 关键字,这是 A. 仅由 EDG 实现,B. 被删除。
    • @fbereto:你不能那样做。要做到这一点需要export,这在我之前的评论中遇到了问题。模板在使用它们的地方被实例化。
    • 手动模板实例化(当然)在所有支持模板的编译器中实现。您是否阅读过我在回答中发布的常见问题解答(更新后的链接)?
    猜你喜欢
    • 2016-03-15
    • 1970-01-01
    • 2017-02-21
    • 2014-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多