我正在使用VS2005和STL的MS实现。但是,类type_info in在“namespace std”之外声明。这为第三方库创建了一些问题,除了找到std :: type_info之外。为什么会这样,是否有任何解决方法?以下是typeinfo开头的示例:
class type_info {
...
};
_STD_BEGIN // = namespace std {
答案 0 :(得分:3)
这很有趣 - 标准确实说(17.4.1.1。图书馆内容)
除了宏,operator new和operator delete之外的所有库实体都在命名空间std中嵌套的命名空间std或命名空间中定义。
并清楚地说(5.2.8类型识别)
typeid表达式的结果是静态类型const std :: type_info(18.5.1)和动态类型const std :: type_info或const name的左值,其中name是从std :: type_info派生的实现定义类它保留了18.5.1中描述的行为。
Ans当然,标题<typeinfo?>
的描述符表明它应该在名称空间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
表达式所做的事情,并且库编写者可能几乎没有直接控制它(并且我' d猜测这就是为什么没有preprocssor解决方法的原因之一)。如果有更多关于编译器如何工作的人,我必须更好地解释这一点(或者超越推测)。
但我认为你必须要求微软(或PJ Plauger / Dinkumware)的某个人真正回答“为什么”。
答案 1 :(得分:1)
实际上,使用using
声明, 是std::type_info
。在某些情况下,std
内部未定义的事实可能是一个问题,但我想知道您是否遇到过其中一个问题。
你的问题是什么?
答案 2 :(得分:0)
因为Visual Studio会执行各种技巧以允许遗留代码工作。 IIRC,标准仅声明type_info
名称空间中存在std
。它并不强制它不存在于全局命名空间内 - 这实际上是一个实现决策。
警告Emptor:我没有在标准中验证这一点。