【问题标题】:Include header file of template type包含模板类型的头文件
【发布时间】:2012-02-10 08:55:12
【问题描述】:

我正在写一个模板类,比方说

template <class T>
class bla {
    bla() ;
    ~bla() ;
};

template <class T>
bla<t>::bla(){}

template <class T>
b<t>::~b(){}

只要 T 是 intchar 等等,它就可以正常工作……但如果它是自定义类 MyClass,则需要包含头文件 MyClass.h ,还是我错了?

问题:如何以类似模板的方式完成此操作,即类似

#include "T.h"

干杯!

【问题讨论】:

    标签: c++ templates header include


    【解决方案1】:

    当您使用bla&lt;MyClass&gt; 时,您需要包含bla 的定义和MyClass 的定义。在定义bla 时,不必知道MyClass。这方面的魔力被称为“两阶段名称查找”:在编译模板定义时,查找所有不依赖于模板参数的名称。在第二阶段,当模板被实例化时,所有剩余的名字都会在实例化的上下文中查找。

    【讨论】:

    • 所以我只需要确保MyClass 提供模板类T 使用的所有方法bla(如果我实例化bla&lt;MyClass&gt;?跨度>
    • 是的,就是这样。本质上,每个模板都应该被认为是使用某些概念来实现的,即具有各自语义和性能复杂性的操作和类型的集合。然后模板参数需要model这个概念,即提供所有必需的操作和类型。
    【解决方案2】:

    嗯,情况正好相反。如果你有一个类MyClass 想要在你的一个模块中使用(C++ 中的翻译单元),那么你将包含模板容器(你放在上面的源代码,我们将它命名为container.h),然后创建数据结构。

    // main.cpp
    
    #include "container.h"
    #include "myclass.h"
    
    int main()
    {
        bla<MyClass> foo;
    
        // lots of more things...
    }
    

    也许问题在于您不知道如何将代码划分为模块。一个简单的经验法则是将每个类放在一个模块中,每个模块都有一个 .h 文件(接口,所有声明所在的位置)和 .cpp 文件(实现文件,您大致在其中编写方法)。

    希望这会有所帮助。

    【讨论】:

    • 不,这不是我的问题。关键在于 Dietmar Kühl 的回答。我想/想知道,模板类bla 现在如何了解T 的方法,即MyClass
    • 好吧,我想我误解了这个问题。无论如何,感谢您阅读并努力发表评论。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 1970-01-01
    • 1970-01-01
    • 2013-11-21
    • 2013-03-26
    相关资源
    最近更新 更多