linux下使用cmake,make 编译代码。-std=20
问题一:<thread>库 多线程在linux下面,报错“undefined reference to `pthread_create”。 但是在windows平台上编译是没有问题。
解决方法:
在cmake最后两段加上
find_package(Threads REQUIRED)
target_link_libraries(项目名称 Threads::Threads)
问题二:模板类继承模板父类,无法在子类中访问到父类的成员变量
比如
template<typename T>
class A{
public:
int a;
}
template<typename T, K>
class B: public A<T>{
public:
void fun(){
int b = a;
}
}
在windows下编译是没有问题的。但是在linux下编译会提示:
error: ‘a’ was not declared in this scope; did you mean ‘xxx’?
解决方法:
在 变量前加 限定符A<T>::
修改后的代码为:
template<typename T>
class A{
public:
int a;
}
template<typename T, K>
class B: public A<T>{
public:
void fun(){
int b = A<T>::a; //添加了限定符
}
}
问题三:
使用类的模板成员函数时,报一些奇怪的错误, 比如
class A{
public:
template<typename T>
void function(){
T* a = new T;
}
int a;
}
int main(){
A a;
a.<double>();
A* b;
b-><double>();
return 0;
}
这里linux上的gcc编译器会把模板的尖括号“<” 识别成 “小于号”
正确的写法是:
插入 template 关键字
class A{
public:
template<typename T>
void function(){
T* a = new T;
}
int a;
}
int main(){
A a;
a.template <double>(); //正确的写法
A* b;
b->template <double>(); //正确的写法
return 0;
}