• wsl和windows下编译C++以及函数重载和函数模板的问题记录


    • wsl+Ubuntu+vscode+c++

    每次打开wsl,进入ubuntu中新建文件夹进行c++编程的时候经常报错,显示配置文件有问题,但是每次按照vscode官方文件配置的话是没有问题的。百思不得其解。

    今晚发现了问题所在。每次新建工作区的时候会自动生成.vscode文件夹,里面是配置好的tasks和launch的json文件,所以每次使用官方文件配置的之后,那个工作区就可以正常使用了,但是如果在Ubuntu中新建文件夹的话,.vscdoe文件夹没有复制过来,或者说没有重新正确建立,所以每次都报错。

    所以解决方法就是在本地windows中建立一个专门用于跑ubuntu系统的区域,配置好之后一劳永逸vscdoe配置wsl下的c++调试环境,一旦有需要就在配置好的文件夹下调试,这样的话.vscode文件都不会有问题。

    附:linux下的编译命令

    在使用cd 可以改变路径,比如到d盘下的project文件夹则是:cd /mnt/d/project

    在路径下新建文件夹是 mkdir newfolder

    编译cpp文件是g++ helloworld.cpp -o project

    运行编译好的文件是 ./project

    也可以不用指定文件名进行编译,如:g++ helloworld.cpp

    这样生成的可执行文件直接用 ./a.out命令执行

    • 函数重模板 function template:

    应用场合:如果有多种不同类型的变量需要比较大小,常规写法是每种不同类型的变量都要写一个函数来比较,这样繁琐,荣誉。

    函数模板解决了这个问题。

    如下代码:在一个项目中,有个项目需求是能够实现多个函数用来返回两个数的最大值,要求能支持char类型、int类型、double类型变量。然后呢,根据这个需求,我们写了以下这个代码

    1. #include
    2. using namespace std;
    3. //比较int 类型
    4. int Max(int a, int b)
    5. {
    6. return a > b ? a : b;
    7. }
    8. //比较char 类型
    9. char Max(char a, char b)
    10. {
    11. return a > b ? a : b;
    12. }
    13. //比较float 类型
    14. float Max(float a, float b)
    15. {
    16. return a > b ? a : b;
    17. }
    18. int main(void)
    19. {
    20. int n = 1;
    21. int m = 2;
    22. cout << "max(1, 2) = " << Max(n, m) << endl;
    23. float a = 2.0;
    24. float b = 3.0;
    25. cout << "max(2.0, 3.0) = " << Max(a, b) << endl;
    26. char i = 'a';
    27. char j = 'b';
    28. cout << "max('a', 'b') = " << Max(i, j) << endl;
    29. return 0;
    30. }

    同样的函数体,但是针对不同类型的参数,需要多次写这个非常相似的函数,这是非常繁琐的,而函数模型的出现就是解决这种问题。

    当我们需要多个函数体一样的函数时,我们可以使用函数模板

    1. #include
    2. using namespace std;
    3. template <typename T> //T is any data type you want , like int or float
    4. T Max(T a, T b) {
    5. return a > b ? a : b;
    6. }
    7. int main(void)
    8. {
    9. int n = 2;
    10. int m = 3;
    11. cout<<"max(2,3)="<< max(n, m)<
    12. char x = 'a';
    13. char y = 'b';
    14. cout<<"max(a,b)="<< max(x, y)<
    15. float i = 3.0;
    16. float j = 4.0;
    17. cout<<"max(3.0,4.0)="<< max(i, j)<
    18. return 0;
    19. }
    • 函数重载 function overloading

    C中规定同一作用域中不能有同名函数出现,但是c++中允许在同意作用域中出现同名函数,但是这些函数的参数类型和参数个数不同。这些同名函数用来实现不同的功能,这就是函数的重载。同样不同类型的数据比较大小,函数名相同,但根据参数类型和参数个数总能匹配到相对于的函数上。

    1. #include
    2. using namespace std;
    3. int Max(int a, int b)
    4. {
    5. return a > b ? a : b;
    6. }
    7. char Max(char a, char b)
    8. {
    9. return a > b ? a : b;
    10. }
    11. float Max(float a, float b)
    12. {
    13. return a > b ? a : b;
    14. }
    15. int main(void)//main 函数中的Max函数总能根据参数的类型和个数匹配到对应的函数
    16. {
    17. int n = 1;
    18. int m = 2;
    19. cout << "max(1, 2) = " << Max(n, m) << endl;
    20. float a = 2.0;
    21. float b = 3.0;
    22. cout << "max(2.0, 3.0) = " << Max(a, b) << endl;
    23. char i = 'a';
    24. char j = 'b';
    25. cout << "max('a', 'b') = " << Max(i, j) << endl;
    26. return 0;
    27. }

    总结:函数模板是对函数重载的简化。

  • 相关阅读:
    【C语言】解决 “address of stack memory associated with local variable ‘num‘ returned”
    初识Java
    初识动态内存分配
    Linux(Ubuntu)下源码开发整个流程完成版本(下载->编译->模拟器运行)
    ETCD集群搭建(实践可用)
    MySQL篇---第四篇
    首次公开!赛迪顾问《湖仓一体技术研究报告》深入解读
    简单好用的文档管理系统MinDoc
    三元组(C++ 实现矩阵快速转置)
    websocket 和 eventsource 的区别和应用
  • 原文地址:https://blog.csdn.net/qq_39333636/article/details/134279948