2009-11-06 57 views
1

我正在使用VS2005和STL的MS实现。但是,type_info中的类声明在“namespace std”之外。这为第三方库创建了一些问题,除了找到std :: type_info之外。为什么会这样,是否有任何解决方法?下面是从所属类别的开头样本:为什么在名称空间std外声明type_info?

class type_info { 
... 
}; 


_STD_BEGIN // = namespace std { 

回答

3

这很有趣 - (17.4.1.1库内容)的标准不说,

所有图书馆的实体,除了宏,新的运营商和operator delete嵌套空间std内的空间std或命名空间中定义。

并明确表示,(5.2.8类型标识)

一个typeid的表达式的结果是静态型常量性病的左值:: TYPE_INFO(18.5.1)和动态型常量性病:: type_info或const name其中name是从std :: type_info派生的实现定义的类,它保留了18.5.1中描述的行为。

ANS,当然,头<typeinfo?>的descriptin指示它应该是在名称空间std(18.5类型标识):

部首<typeinfo>概要

namespace std { 
    class type_info; 
    class bad_cast; 
    class bad_typeid; 
} 

所以type_info应该在std命名空间中(而不在其外部)。我猜想这是一个错误,或者有一大组代码(或一小组重要的代码)需要它在std命名空间之外。我曾以为他们会使用一些预处理器魔法来制作它,所以如果需要的话,你可以强制它在std命名空间中(或者反过来 - 默认情况下使其成为std并允许宏或其他东西来强制它到全局命名空间)。

然而,对于type_info一个额外的皱纹是它的typeid操作的结果(更准确地说,从type_info派生出来的是结果),所以可能有什么编译器做为typeid运营商的紧密相关性的图书馆需要符合。因此,type_info不在命名空间std中的事实可能是由于编译器对typeid表达式的处理,而库编写者可能对此没有直接控制权(而且我猜这就是为什么没有预处理器解决方法的原因之一问题)。有人比我更了解编译器的工作方式,我不得不更好地解释它(或者超越猜测)。

但我认为你必须向微软(或者PJ Plauger/Dinkumware)的某个人询问“为什么”的真实答案。

+0

好的,我在typeinfo文件中发现了一条评论。在parafracing中,它说“type_info不包含在标准名称空间中,因为RTTI编译器通常有自己的实现”。根据评论中的建议,我简单地将它转化为std来解决问题。 – Rolle 2009-11-07 00:03:49

+0

您能否提供关于该评论位置的更多信息和/或您看到的“”标头的编译器版本? – 2009-11-07 00:19:11

+0

只是在文件的开头,全部包含和一个杂注调用。该文件适用于wince 6,并且很可能在很久以前与Platform Builder或预构建的SDK一起使用。它是微软的版权。这里是完整的评论: //根据标准 //返回来自typeid运算符的类型//这实际上应该在命名空间std中,但编译器 //有关于此类的内置知识。不要修改 //这里没有任何内容,而不检查编译器生成的RTTI信息 的布局。 – Rolle 2009-11-07 00:46:54

1

随着using声明,实际上,有一个std::type_info。可能会出现这样的情况:std内部没有定义这个事实可能是一个问题,但我不知道是否遇到了其中一个问题。

你的问题是什么?

+0

对不起,我从错误的类复制而来。我使用的是Windows CE(也是MS),它缺少using指令。这是STL特定版本中的错误吗? – Rolle 2009-11-06 14:29:45

+0

如果标准将一个类定义为属于'std',那么它应该被定义为这样或ADL(Koenig查找)可能会中断。 – MSalters 2009-11-06 14:56:49

0

由于Visual Studio中做各种技巧,以允许遗留代码工作。 IIRC,该标准仅声明type_info存在于std名称空间内。它并没有要求它不存在于全局名称空间内 - 这实际上是一个实现决定。

警告Emptor:我还没有在标准中对此进行验证。

+1

实际上,标准为什么保留实现的下划线前缀的原因是实现者不能只声明普通名称。 ':: _ typeinfo'将被允许。 – MSalters 2009-11-06 14:55:50

相关问题