||
最近使用C++时发现,私有嵌套类无法在类声明外作为类函数的set参数使用,使用的编译器是gcc,代码示例如下:
class A {
class B {
double a;
double b;
bool operator < ( const B & y) {
return a < y.a;
}
};
void fc( const std::set<B> & par);
};
void A::fc( const std::set<B> & par)
{ };
以上代码无法通过编译,错误提示说,B是私有类型,无法使用std::set<B>作为参数。但是在类中声明一个别名,并使用这个别名后就能通过了。代码如下:
class A {
class B {
double a;
double b;
bool operator < ( const B & y) {
return a < y.a;
}
};
typedef std::set<B> setB;
void fc( const setB & par);
};
void A::fc( const setB & par)
{ };
估计编译器是认为类函数参数set<?>中?部分不在类的作用域内,所以不能使用B类型,编译无法通过。但是声明使用别名后,尽管实际上一样的结果,却能通过编译了。不知道编译器怎么理解(什么时候)解析别名的,真是个奇葩的特性,不知道这是gcc编译器的特性,还是语言标准就是这么规定的。似乎怎么都觉得有点蛋*疼啊。
另一个无语的问题是,千万不要轻易使用vector<bool>类型,这个被声明成了vector的特化版,和标准的vector完全不一样,它为节省空间,用每一位存储一个bool类型。就是一个char存储了8个bool变量,结果无法使用右值引用,实际上是一个伪容器。
Archiver|手机版|科学网 ( 京ICP备07017567号-12 )
GMT+8, 2024-6-2 07:24
Powered by ScienceNet.cn
Copyright © 2007- 中国科学报社