编程C++开发人员

在C++中,什么是模板(templates)?存在哪些类型的模板?在设计和使用模板时可能会遇到什么困难和错误?请展示一个类模板和一个函数模板的示例。

用 Hintsage AI 助手通过面试

答复。

模板(templates) 是C++的一种机制,允许创建通用类和函数,可以与不同的数据类型一起使用,而无需重复代码。这是实现STL容器、算法以及许多通用编程模式的基础。

模板类型

  • 函数模板:允许为不同类型创建一个函数。
  • 类模板:允许创建与不同类型一起工作的类。
  • 值参数模板:可以用常量值而不仅仅是类型来参数化。

类模板示例

template<typename T> class Box { public: Box(T value): data(value) {} T get() const { return data; } private: T data; };

函数模板示例

template<class T> T add(const T& a, const T& b) { return a + b; }

知识考验问题。

可以仅显式特化模板类的一个方法,而无需特化整个类吗?如果可以,怎么做到的?

答复:
可以。不必特化整个类;只需特化单独的方法:

template <typename T> class Foo { public: void bar(); }; template <> void Foo<int>::bar() { // 仅对int特化bar方法 // 实现 }

由于对主题细节的无知而产生的真实错误示例。


故事
在项目中编写了一个比较函数的模板:

template <typename T> bool cmp(const T& a, const T& b) { return a < b; }

当与没有<运算符的类型一起使用时,出现了编译错误,这个错误被困扰了很久,因为诊断信息仅在实例化模板时给出,而不是在其定义时给出。


故事
开发人员试图在模板函数中使用用户定义的类进行加法,但忘记重载+运算符。这导致在首次使用该类时出现编译错误。


故事
在基于类模板开发容器时,编写了一个不依赖于模板类型的方法,但被放置在类的外部而没有显式特化:

template<> int MyContainer<int>::size() const { ... }

这导致了链接错误,因为特化被声明,但未为所有类型正确实现。