- 模板函数特化出现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;}
- 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>
参考博客 - 出现error: cannot bind non-const lvalue reference of type ‘XXX&’ to an rvalue of type ‘XXX’
因为c++中函数参数如果是一个非const的引用类型的话,则隐含着输入参数在函数执行过程中被改变的可能,而如果传入一个临时变量,函数改变临时变量是没有意义的,所以c++规定非const的引用形参不能接受右值变量作为实参。解决办法是要么更改函数定义,使用const引用形参或者值传递的形参;要么更改调用时使用的实参,不要使用临时变量。这一点在windows下可能宽松点,所以我原先在windows下并没有报错。
c++程序由windows迁移到linux的一些问题
最新推荐文章于 2024-07-16 18:00:34 发布