我正在使用VS2005和STL的MS实现。但是,type_info中的类声明在“namespace std”之外。这为第三方库创建了一些问题,除了找到std :: type_info之外。为什么会这样,是否有任何解决方法?下面是从所属类别的开头样本:为什么在名称空间std外声明type_info?
class type_info {
...
};
_STD_BEGIN // = namespace std {
我正在使用VS2005和STL的MS实现。但是,type_info中的类声明在“namespace std”之外。这为第三方库创建了一些问题,除了找到std :: type_info之外。为什么会这样,是否有任何解决方法?下面是从所属类别的开头样本:为什么在名称空间std外声明type_info?
class type_info {
...
};
_STD_BEGIN // = namespace std {
这很有趣 - (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)的某个人询问“为什么”的真实答案。
由于Visual Studio中做各种技巧,以允许遗留代码工作。 IIRC,该标准仅声明type_info
存在于std
名称空间内。它并没有要求它不存在于全局名称空间内 - 这实际上是一个实现决定。
警告Emptor:我还没有在标准中对此进行验证。
实际上,标准为什么保留实现的下划线前缀的原因是实现者不能只声明普通名称。 ':: _ typeinfo'将被允许。 – MSalters 2009-11-06 14:55:50
好的,我在typeinfo文件中发现了一条评论。在parafracing中,它说“type_info不包含在标准名称空间中,因为RTTI编译器通常有自己的实现”。根据评论中的建议,我简单地将它转化为std来解决问题。 – Rolle 2009-11-07 00:03:49
您能否提供关于该评论位置的更多信息和/或您看到的“”标头的编译器版本? –
2009-11-07 00:19:11
只是在文件的开头,全部包含和一个杂注调用。该文件适用于wince 6,并且很可能在很久以前与Platform Builder或预构建的SDK一起使用。它是微软的版权。这里是完整的评论: //根据标准 //返回来自typeid运算符的类型//这实际上应该在命名空间std中,但编译器 //有关于此类的内置知识。不要修改 //这里没有任何内容,而不检查编译器生成的RTTI信息 的布局。 – Rolle 2009-11-07 00:46:54