终于有了间茅草棚

——我走时,会否有随风飘散的痕迹?

外面的风好大,雨也淅淅沥沥的。

世间种种的诱惑不惊不扰我清梦,山高路远不绝我追踪你绝美的笑容,登高一呼时才懂始终在为你心痛,俯首对花影摇动都是东风在捉弄

世间种种的迷惑都是因你而猜错,水光月光又交融描述这朗朗的夜空,生死到头的相从似狂花落叶般从容,当一切泯灭如梦就在远山被绝
随笔 - 40, 文章 - 2, 评论 - 257, 引用 - 3

导航

<2005年11月>
303112345
6789101112
13141516171819
20212223242526
27282930123
45678910

留言簿(11)

随笔档案

文章档案

收藏夹

其它的我

友情连接

网页连接

搜索

最新评论

  • 1. re: 关于质数(素数)的算法
  • 1121=19*59
  • --李圆欢
  • 2. re: void *几用
  • 方法都不错
  • --员工生日礼物
  • 3. re: void *几用
  • to oshj:
    最近才悟道这个用法,没想到你都用了很多了。

    to brent:
    不是为了玩才玩,这里每种用法在特定的情况下,都有他相应的好处。不过,我是做为自己记录的,指不定什么时候就忘记了,还可以这么用。
    1. 可以使得头文件简单,而且出于实现保密的需要,还是很有用处的。
    2. 很多时候对象本身应该简洁,但往往应对不同的需要,通常需要数据对应。举个例子,比如玩家在哪个房间,在哪个房间最好不要直接记在玩家身上,用数据注入的方式,能够很快的获得该信息。
    3. 因为是做为库暴露头文件的,使用者并不关心void *的实际意义,而且能够加快编译速度。真正要关心时,就Graphics.h这个头文件是不够的,通常会需要了解整底层个实现,才能较好的扩充。
  • --清风雨
  • 4. re: void *几用
  • 还在玩C++语言,你这玩法, 又不是用在导弹导航上...
    别人看不懂的代码,都不是好代码,分数为0

    int sub(any) { any; return TRUE;}
    (void)sub(any);

  • --brent
  • 5. re: void *几用
  • 个人用3 的情况比较多
  • --oshj
  • 6. re: 简要记录sizeof和内存对齐
  • 很清楚,受教了
  • --rdeam
  • 7. re: 局部变量
  • 我不用ATL,一般都是用标准c++支持的和平台API。
    crt里的wcs和mbs转换的函数,ms的实现是不完整的,在它的实现代码里有一段说明;而且还要设置local,比较烦琐。
  • --清风雨
  • 8. re: 简单字符串转换
  • win下,atl中有CT2CA, CW2CA等一系列转换类。
    crt中有wcstombs和mbstowcs
  • --局部变量
  • 9. re: 一个奇怪但可能有用的缓存
  • vc资料站:http://www.vcmsdn.com/     对学习很有帮助的,可以上去

    看看,或加群46138350,里面有高手可以请教的。
  • --maggie
  • 10. #progma整理
  • #pragma整理
  • --hi_wyl
  • 11. re: hpho
  • 缓冲在一等程度上是临时性的,而且实际上如果保持std::vector的iterator下次使用,也会有问题。

    所以,这个问题也就是使用时不允许这样用。
  • --清风雨
  • 12. re: 一个奇怪但可能有用的缓存
  • 如果有指针引用着arrange()所调整的那块内存,那就乱了.
  • --hpho
  • 13. re: 一个奇怪但可能有用的缓存
  • 用std::string不就行了?
  • --金庆
  • 14. re: ZiDing
  • 鉴于你的建议,前段时间我看了下boost的内存对象池,没有过于深入,
    判断下来属于做法类似,性能应该相当,甚至可能我这个略好一点。

    因为编写测试是一件相当麻烦,而且要求也很高的事,而要全面又很难。

    boost的代码我看起来比较难读,维护、调试起来对我来说是一个大麻烦。所以,我一般不选择boost。
  • --清风雨
  • 15. re: 简单内存对象池
  • 和boost的对比过没有?
  • --ZiDing

阅读排行榜

评论排行榜

namespace 和 操作符重载

最近工作中,给代码加了命名空间,结果遇到一个意外。也或许并不是意外,但自己觉得不知道怎么解释好:VC7.1的bug?C++语法?template编译?不管怎么说,自己都觉得比较的怪异,顺便先记录一下:
定义1:///都在namespace下定义
namespace test
{
    class testClass
    {
    };
    bool operator<( const testClass &class1,const testClass &class2 )
    {
        return true;
    }
};

使用1:///显然是肯定可以的
using namespace test;

bool test1( void )
{
    testClass obj1,obj2;
    return obj1 < obj2
}

使用2:///显然也是可以的
#include <vector>
#include <algorithm>

using namespace test;

void test2( void )
{
    std::vector< testClass > vec;
    std::sort( vec.begin(),vec.end() );
}

定义2:///类在全局定义,操作符在namespace里(虽然,你自己可能不太会这么写,但可能testClass已经定义了)
class testClass
{
};
namespace test
{
    bool operator<( const testClass &class1,const testClass &class2 )
    {
        return true;
    }
};

使用1:///也是可以的
using namespace test;

bool test1( void )
{
    testClass obj1,obj2;
    return obj1 < obj2
}

使用2:///意外,编译没有通过
#include <vector>
#include <algorithm>

using namespace test;

void test2( void )
{
    std::vector< testClass > vec;
    std::sort( vec.begin(),vec.end() );
}

使用3:///和2一样,编译不能通过
#include <vector>
#include <algorithm>

namespace test
{
    void test3( void )
    {
        std::vector< testClass > vec;
        std::sort( vec.begin(),vec.end() );
    }
};

定义3:///都在全局下定义
class testClass
{
};
bool operator<( const testClass &class1,const testClass &class2 )
{
    return true;
}
这种,没有任何异义,都能编译通过。

定义4:///类在namespace里,操作符在全局
这种,也没有任何异义,同样都能编译通过。

我使用的是vc71(vc.net 2003),至于vc6+sp6或别的编译器会怎样,没有试过。

posted on 2005-11-21 14:11 终于有了间茅草棚 阅读(4350) 评论(10)  编辑 收藏

评论

# re: namespace 和 操作符重载

把using namspace 放到#include<vector>前面试试
2005-11-21 17:28 | heroboy

# heroboy

前面试过,一样的,都是不能通过编译。
2005-11-21 18:03 | 清风雨

# re: namespace 和 操作符重载

我认为a<b 中的operator< 默认就是全局的,就如你调用cmp(a,b)那么这里的cmp就是认为是全局的
所以,如果operator<定义在全局的话,无论,a,b的类型定义在何处都可以编译。
当在全局中找不到operator<时,根据koenig法则,会查找它们参数的namespace,所以当operator<和a或b的类型在同一个namespace的话就可以编译
2005-11-22 19:57 | heroboy

# re: heroboy

什么叫koenig法则?人名?

我只是觉得,编译器应该在可见空间里,找到operator<。而且直接使用也是可以的,只是用了std::sort就不可以了,这个感觉就有些怪怪的了。
2005-11-22 20:33 | 清风雨

# re: namespace 和 操作符重载

What is koenig lookup?
http://h21007.www2.hp.com/dspp/tech/tech_TechDocumentDetailPage_IDX/1,1701,990,00.html

例如:
std::X x;
func(x);
如果在当前namespace中找不到func的话,那么就会查找,std::func存在不存在
2005-11-22 21:43 | heroboy

# re: heroboy

我昨天就在想,类型和函数都应该是一样的,都会进行同样的查找。
正如你的评论一样,其实都会查找。
而operator< 已经被我using了出来了。
不知道这个问题是C++标准未定义的,还是VC的实现问题,抑或标准就是这么定义的。
2005-11-26 11:38 | 清风雨

# re: namespace 和 操作符重载


koening lookup是指根据参数查找函数名。
koening查找仅在当前命名空间和参数的命名空间中查找。

所以无法找到 bool operator < (...).

解决方法:
操作符"<"定义到参数相同的命名空间;

指定比较函数:
    std::sort(vec.begin(), vec.end(), test::operator < ); 


2006-07-14 14:29 | 金庆

# re: namespace 和 操作符重载

更正一下:
koening查找仅在当前命名空间和参数的命名空间中查找。 
应为
koening lookup 范围是当前可见的命名空间和参数的命名空间。 

即然 using namespace test; 就应该找得到函数定义。
而且不需要koening查找也能找到。
好象是std空间中不能查找其它空间中的函数定义。
还需要研究。
2006-07-14 16:29 | 金庆

# re: namespace 和 操作符重载

加上这一句也是解决方案一种:

using test::operator <;

所以又是一个问题:

using namespace test;    // error?
using test::operator <;      // OK!

两者不能等效?

2006-07-14 16:34 | 金庆

# re: namespace 和 操作符重载

这是vc7的一个bug, vc7仅仅支持运算符的koenig查找,对普通函数并不实施koenig查找而导致上面的代码编译不过.
具体可以看下下面这篇文章
http://www.royaloo.com/articles/articles_2003/bug01.htm

不要轻易质疑标准:),编译器出问题的几率要大的多,尤其是微软的:)
2006-09-03 13:23 | 路过
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]