margin的个人博客分享 http://blog.sciencenet.cn/u/margin

博文

C++私有嵌套类出现的问题

已有 3819 次阅读 2015-2-23 20:07 |系统分类:科研笔记| amp, 私有嵌套类, 容器

最近使用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变量,结果无法使用右值引用,实际上是一个伪容器。



https://blog.sciencenet.cn/blog-707428-869706.html

上一篇:日积月累
下一篇:从云南回到北京
收藏 IP: 116.55.97.*| 热度|

0

该博文允许注册用户评论 请点击登录 评论 (0 个评论)

数据加载中...

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-6-2 07:24

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部