C++ 模板 : header files still broken?

标签 c++ templates

以前在C++中使用模板类,实现必须在头文件中或者#included到头文件的底部。

我已经有几年没有使用 C++ 模板了;我刚开始再次使用它们,并观察到这种行为似乎 持续存在。现在还是这样吗?还是编译器现在足够聪明,可以将实现与接口(interface)分开?

最佳答案

从技术上讲,它们不需要在头文件中。

这种用法的一个例子是当你有一个带有一组固定版本的模板类时(为了参数的缘故,假设是 char 和 wchar_t)。然后您可以将所有方法声明放入源文件中并显式实例化这两个版本。这具有其他人无法为不打算使用的类型分配模板的安全性。

// X.h
template<typename T>
class X
{
     // DECLARATION ONLY OF STUFF
     public:
       X(T const& t);
     private:
       T m_t;
};

// X.cpp
#include "X.h"

// DEFINTION OF STUFF
template<typename T>
X<T>::X(T const& t)
    :m_t(t)
{}

// INSTANCIATE The versions you want.
template class X<char>;
template class X<wchar_t>;


// Main.cpp
#include "X.h"

int main()
{
    X<chat>    x1('a');
    X<wchar_t> x2(L'A');
    // X<int>     x3(5);   // Uncomment for a linker failure.
}

假设人们不能直接包含 X.cpp(因为它不是由发行版提供的)那么其他人就不能使用 X 或 X 等。但是 abovr 类是完全定义的。

我还看到这种技术用于减少编译时间。因为每个编译单元都不会重新生成相同版本的 X,所以我们只能在一个地方获得定义(因此需要一个编译成本)。这样做的缩减是您必须手动实例化您使用的每个单独版本的 X。

关于C++ 模板 : header files still broken?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1492591/

相关文章:

drupal - 主题和模板有什么区别?

c++ - OpenCV 错误 SVM 标识符未定义

c++ - 如何编写 "pointer to const"类型特征?

html - 如何制作表格行中某些(但不是全部)表格单元格的 Vue.js 组件?

c++ - 注释变量与 Doxygen 内联会带来任何惩罚吗?

c++ - 我的模板语法有什么问题?

visual-studio - 我可以在Visual Studio项目模板中创建 "Solution"级别的项目吗?

c++ - 如何将 vector<string> 和 push_back() 格式化为其他 vector ?

c++ - 我已经完成了 << 运算符重载,但它不起作用

c++ - 如何在使用 cmake 构建的 LLVM 中启用 --debug-only?