将C ++模板函数定义存储在.CPP文件中

我有一些模板代码,我宁愿将它们存储在CPP文件中,而不是在标题中内联。 我知道只要您知道将使用哪种模板类型,就可以完成此操作。 例如:

.h文件

class foo
{
public:
    template <typename T>
    void do(const T& t);
};

.cpp文件

template <typename T>
void foo::do(const T& t)
{
    // Do something with t
}

template void foo::do<int>(const int&);
template void foo::do<std::string>(const std::string&);

请注意最后两行--foo :: do模板函数仅用于ints和std :: strings,因此这些定义意味着应用程序将链接。

我的问题是 - 这是一个讨厌的黑客攻击,还是会与其他编译器/连接器一起工作? 我现在只在VS2008上使用这个代码,但是会想要移植到其他环境。


您所描述的问题可以通过在标题中定义模板或通过上述方法来解决。

我建议阅读C ++ FAQ Lite中的以下几点:

  • 为什么我不能将我的模板类的定义从其声明中分离出来并放入.cpp文件中?
  • 我怎样才能避免与我的模板功能的链接器错误?
  • C ++关键字导出如何帮助解决模板链接器错误?
  • 他们详细介绍了这些(和其他)模板问题。


    对于本页其他人想知道什么是正确的语法(如我一样)显式模板特化(或至少在VS2008),其以下...

    在你的.h文件中...

    template<typename T>
    class foo
    {
    public:
        void bar(const T &t);
    };
    

    并在你的.cpp文件中

    template <class T>
    void foo<T>::bar(const T &t)
    { }
    
    // Explicit template instantiation
    template class foo<int>;
    

    此代码格式良好。 你只需要注意,模板的定义在实例化的时候是可见的。 引用标准§14.7.2.4:

    非导出函数模板,非导出成员函数模板或类导出模板的非导出成员函数或静态数据成员的定义应存在于明确实例化的每个翻译单元中。

    链接地址: http://www.djcxy.com/p/6329.html

    上一篇: Storing C++ template function definitions in a .CPP file

    下一篇: Hibernate subquery of String collection match