c++程序由windows迁移到linux的一些问题

  1. 模板函数特化出现explicit specialization in non-namespace scope
    c++标准规定模板特化只能在类所在的命名空间,在linux上对c++标准遵循更严格,而windows上相对会宽松一点。参考博客1博客2
    =>更改成将特化的模板函数放在类外面与类同一个名字空间里(如果有名字空间的话):
    class Test{
    template<class T>
    void foo(T t){}
    };
    template<> void Test::foo<int>(int t){std::cout<<t<<std::endl;}
    
    =>但是这样会面临另一个问题,就是如果该头文件被多次包含(被同一个程序的多个文件包含),则会导致特化函数重复定义,因为特化函数归根到底是一个具体的函数,而不是一个模板。我目前对于此的解决办法是像一般函数一样,声明实现分离,在.h文件中声明:
    //Test.h
    class Test{
    template<class T>
    void foo(T t){}
    };
    template<> void Test::foo<int>(int t);
    
    然后在.cpp文件中:
    #include "Test.h"
    template<> void Test::foo<int>(int t){std::cout<<t<<std::endl;}
    
    本来模板类是要全部定义在一个头文件中的,这样拆分成了两个文件,这样的话还会有一个问题,就是必须要为特化的函数生成共享库供使用方调用,否则会出现未定义的引用。所以参看这篇博客使用内联函数:
    class Test{
    template<class T>
    void foo(T t){}
    };
    template<> inline void Test::foo<int>(int t){std::cout<<t<<std::endl;}
    
  2. std::exception初始化出现error: no matching function for call to std::exception:exception(const ch[72])
    改成:
    std::logic_error ex("XXXXX");
    throw std::exception(ex);
    
    同时添加头文件#include <stdexcept>
    参考博客
  3. 出现error: cannot bind non-const lvalue reference of type ‘XXX&’ to an rvalue of type ‘XXX’
    因为c++中函数参数如果是一个非const的引用类型的话,则隐含着输入参数在函数执行过程中被改变的可能,而如果传入一个临时变量,函数改变临时变量是没有意义的,所以c++规定非const的引用形参不能接受右值变量作为实参。解决办法是要么更改函数定义,使用const引用形参或者值传递的形参;要么更改调用时使用的实参,不要使用临时变量。这一点在windows下可能宽松点,所以我原先在windows下并没有报错。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值