【问题标题】:Mixing function templates and ordinary functions混合函数模板和普通函数
【发布时间】:2011-11-03 23:39:33
【问题描述】:

我在头文件中声明了几个小帮助函数。它看起来像这样:

//contents of foo.h
#ifndef FOO_H
#define FOO_H

void foo1(int a);
template <class mType>
void foo2( mType b);

#endif

//contents of foo.cpp
#include foo.h

void foo1(int a)
{
  ...
}

template <class mType>
void foo2( mType a)
{
  ...
}

通常当只有功能模板时,我会添加一个#include "foo.cpp" 在 foo.h 的末尾使模板函数的实现在编译时对编译器可见。然而,当混合函数模板和普通函数时,这种方法似乎不起作用。在这种情况下如何解决模板函数和普通函数?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    您永远不应该包含 cpp 文件。

    将模板的实现放在头文件中。如果你想把它分开,那就做2个头文件。

    //contents of foo.h
    
    void foo1(int a);
    
    template <class mType>
    void foo2( mType a)
    {
    ...
    }
    
    //contents of foo.cpp
    #include foo.h
    
    void foo1(int a)
    {
    ...
    }
    

    (或者,还有export关键字,虽然没有主要的编译器支持它并且在C++11中已经被移除了,换句话说,不要使用它)

    【讨论】:

    • 即使提到了export 关键字从未实现过的无用,我也很想投反对票。否则,很好的答案。
    • @AlexandreC。我认为使用 export 比包含 cpp 文件更好。
    • @Pubby8 感谢您的回答。我希望有一个更优雅的解决方案。我想知道你的声明永远不会在头文件的末尾包含 cpp 文件。提到它是构造模板代码的一种可能方法。例如:codeproject.com/KB/cpp/templatesourceorg.aspx
    • @tisch 其他人可能会更好地回答为什么不应包含 cpp 文件。据我所知,cpp 文件是被编译的文件——包括它们会导致重复的代码分布在不同的翻译单元中。
    猜你喜欢
    • 2019-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-31
    • 1970-01-01
    • 2020-07-15
    • 2011-10-03
    相关资源
    最近更新 更多