温馨提示×

linux c++如何使用模板

小樊
36
2026-09-20 10:33:13
栏目: 编程语言

在 Linux 下使用 C++ 模板(Template)和在其他平台(Windows/macOS)本质上是一样的,因为模板是 C++ 语言标准的一部分,不依赖操作系统。差别只在于 编译工具链(如 g++ / clang++) 和开发环境。

下面从 基础 → 进阶 → Linux 下编译实践 给你一个完整说明。


一、什么是模板(Template)

模板用于 泛型编程,让代码不依赖具体类型。

两类最常见:

  • 函数模板
  • 类模板

二、函数模板(Function Template)

示例:通用加法函数

#include <iostream>

template <typename T>
T add(T a, T b) {
    return a + b;
}

int main() {
    std::cout << add(1, 2) << std::endl;
    std::cout << add(1.5, 2.5) << std::endl;
    return 0;
}

编译(Linux)

g++ test.cpp -o test
./test

三、类模板(Class Template)

示例:通用容器

#include <iostream>

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

int main() {
    Box<int> intBox(10);
    Box<std::string> strBox("hello");

    std::cout << intBox.get() << std::endl;
    std::cout << strBox.get() << std::endl;
}

四、Linux 下模板常见写法(重点)

1️⃣ 模板通常写在头文件中

⚠️ 重要规则

模板代码一般必须放在 .h.hpp 文件中,不能只放在 .cpp

❌ 错误示例(链接错误):

// foo.cpp
template <typename T>
void foo(T x) {}

✅ 正确:

// foo.h
template <typename T>
void foo(T x) {
    // 实现
}

2️⃣ 多文件模板示例(Linux 项目)

foo.h

#ifndef FOO_H
#define FOO_H

template <typename T>
T max(T a, T b);

#include "foo.tpp"
#endif

foo.tpp

template <typename T>
T max(T a, T b) {
    return a > b ? a : b;
}

main.cpp

#include "foo.h"
#include <iostream>

int main() {
    std::cout << max(3, 5) << std::endl;
}

五、显式实例化(高级)

如果你 非要把模板实现放 cpp,可以显式实例化:

// foo.cpp
template int max<int>(int, int);

但不够灵活,不推荐新手用。


六、Linux 编译模板程序的注意点

推荐编译器

g++ -std=c++17 main.cpp -o app

或 clang:

clang++ -std=c++20 main.cpp -o app

常见错误

undefined reference to ...

  • 原因:模板未实例化
  • 解决:实现放在头文件

七、可变参数模板(C++11+)

template<typename... Args>
void print(Args... args) {
    (std::cout << ... << args) << std::endl;
}

八、总结

✅ Linux 下使用 C++ 模板:

  • 语言层面与平台无关
  • 多用 g++ / clang++
  • 模板实现放头文件
  • 小心链接问题

如果你愿意,我可以:

  • 给你一个 完整 Linux 模板工程结构
  • 模板特化
  • 或结合 STL / 智能指针 / 线程 示例

你更想看哪一块?

0