开发者社区> 问答> 正文

C++ 为什么只能在头文件中实现模板

引用来自C ++标准库:教程和手册: (该链接需要谷哥)

目前使用模板的唯一可移植方法是通过使用内联函数在头文件中实现模板。

为什么是这样?

(澄清:头文件不是唯一的可移植解决方案。但是它们是最方便的可移植解决方案。)

问题来源:stackoverflow

展开
收起
禹果 2020-03-20 23:55:00 1287 0
2 条回答
写回答
取消 提交回答
  • 喜欢编程

    因为模版实现不放到头,你动态、静态链接就没办法用!这个是C++模版实现的局限性!

    2023-04-08 08:32:32
    赞同 展开评论 打赏
  • 警告:没有必要把在头文件中实现它,这个答案的末尾有替代解决方案。

    无论如何,您的代码失败的原因是:在实例化模板时,编译器会使用给定的模板参数创建一个新类。例如:

    struct Foo
    {
        T bar;
        void doSomething(T param) {/* do stuff using T */}
    };
    
    // somewhere in a .cpp
    Foo<int> f; 
    

    阅读此行时,编译器将创建一个新类(我们称之为FooInt ),其等效于以下内容:

    {
        int bar;
        void doSomething(int param) {/* do stuff using int */}
    }
    

    因此,编译器需要访问方法的实现,以使用模板参数(在本例中为int )实例化它们。 如果不在头文件中实现,则将无法访问它们,因此编译器将无法实例化模板。

    常见的解决方案是将模板声明写入头文件中,然后在实现文件(例如.tpp)中实现该类,并在头末尾包含该实现文件。

    Foo.h

    struct Foo
    {
        void doSomething(T param);
    };
    
    #include "Foo.tpp"
    

    Foo.tpp

    void Foo<T>::doSomething(T param)
    {
        //implementation
    }
    

    用这种方式,实现仍与声明分开,但编译器可以访问。

    Alternative solution

    另一个解决方案是使实现分离,并显式实例化您需要的所有模板实例:

    Foo.h

    template <typename T> struct Foo { ... };
    

    Foo.cpp

    
    // explicit instantiations
    template class Foo<int>;
    template class Foo<float>;
    // You will only be able to use Foo with int or float
    

    如果我的解释不够清楚,您可以查看有关此主题的C ++ Super-FAQ

    回答来源:stackoverflow

    2020-03-21 00:05:13
    赞同 展开评论 打赏
问答分类:
C++
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
使用C++11开发PHP7扩展 立即下载
GPON Class C++ SFP O;T Transce 立即下载
GPON Class C++ SFP OLT Transce 立即下载