温馨提示×

ubuntu c++怎样用模板类

小樊
46
2026-09-02 09:08:59
栏目: 编程语言

在 Ubuntu 下使用 C++ 模板类(template class)和在其他 Linux / 平台上是一样的,主要依赖 g++ 编译。下面从基本语法、使用方式、编译方法、常见坑几个方面讲清楚。


一、最简单的模板类示例

1️⃣ 头文件(推荐把模板类写在头文件里)

Stack.h

#ifndef STACK_H
#define STACK_H

#include <vector>

template <typename T>
class Stack {
public:
    void push(const T& value) {
        data.push_back(value);
    }

    T pop() {
        T val = data.back();
        data.pop_back();
        return val;
    }

    bool empty() const {
        return data.empty();
    }

private:
    std::vector<T> data;
};

#endif

2️⃣ 使用模板类

main.cpp

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

int main() {
    Stack<int> s;
    s.push(10);
    s.push(20);

    std::cout << s.pop() << std::endl;
    return 0;
}

二、在 Ubuntu 下编译

基本编译

g++ main.cpp -o test

运行

./test

模板类一般不需要单独编译成 .o 文件


三、为什么模板类通常写在头文件?

因为:

  • 模板是编译期机制
  • 编译器在实例化 Stack<int> 时需要看到完整定义

❌ 错误示例(常见坑):

// Stack.cpp 里写模板实现
template class Stack<int>; // 必须显式实例化

✅ 推荐方式:

  • 声明 + 实现都放 .h
  • 或使用 .hpp

四、模板类分离实现(进阶)

如果你一定要分开写

Stack.h

template <typename T>
class Stack {
public:
    void push(const T& value);
};

Stack.cpp

#include "Stack.h"
#include <vector>

template <typename T>
void Stack<T>::push(const T& value) {
    // 实现
}

// 显式实例化
template class Stack<int>;
template class Stack<double>;

编译:

g++ main.cpp Stack.cpp -o test

⚠️ 不推荐,除非你只用固定类型


五、Ubuntu 下查看 g++ 版本

g++ --version

建议:

  • C++11 及以上:g++ -std=c++11
  • C++17:g++ -std=c++17

六、常见错误

❌ 忘记模板参数

Stack s;        // 错误
Stack<int> s;   // 正确

❌ 模板类成员函数少了 template

template <typename T>
void Stack<T>::push(...) { }

七、实用建议

✅ 模板类适合:

  • 容器
  • 算法
  • 通用工具类

✅ Ubuntu 开发常用组合:

  • g++
  • CMake
  • VS Code / CLion

如果你愿意,我可以:

  • 给你一个 CMake + 模板类完整示例
  • 模板类特化
  • 模板类 + 继承
  • 结合 Ubuntu 实际项目结构

你可以直接说你现在是「初学 / 写项目 / 刷题 / 面试」。

0