Visual Studio 2012 中的奇怪错误

Posted

技术标签:

【中文标题】Visual Studio 2012 中的奇怪错误【英文标题】:weird bug in visual studio 2012 【发布时间】:2014-12-17 11:41:05 【问题描述】:

为什么这段代码可以在 Visual Studio 2012 上编译和运行?这只是一个错误还是我错过了什么

namespace SSSS
    
        namespace SSS
        
            template <class T>
            class SS
            
            public:
                typedef T ValueType;
                SS()std::cout<<T();
                SS(T t)  std::cout<<t;
            ;

            typedef SS<double> DD;
        
    
    int main()
    
        SSSS::SSS::DD::SS d;
    

【问题讨论】:

VS 2012 还是 2013?当这段代码被编译时,你期望会发生什么? 为什么不希望它编译运行? 我希望编译器必须警告,SSSS::SSS::DD::SS 不是类型。 请将其添加到问题中以使其完整。 正确的语法应该是class SSSS::SSS::DD::SS d;,这可能只是VS中的一个bug 【参考方案1】:

听起来您的编译器将SS 解释为注入的类名;在这种情况下,它是一个类型,所以声明是有效的。

但是,名称查找规则说它应该被解释为构造函数,而不是类,所以你的编译器是错误的。其他拒绝代码:http://ideone.com/7fJ1VM

有效的类型名称可以是类型别名DD,或使用注入的类名称class DD::SS 的详细类型说明符。

【讨论】:

我不确定我是否同意第二段。这是基于 [class.qual]/2 开头的:在构造函数是可接受的查找结果的查找中。在表达式的上下文中,我不认为构造函数是一个有效的结果(地址不能取,它不能被用户代码显式调用,这不能是构造函数声明......),这意味着整个段不适用,这不是失败的原因。 [同样clang接受代码,所以三分之二接受它] @DavidRodríguez-dribeas:名称查找不考虑上下文,因为在知道名称的含义之前无法确定上下文。它包含一个示例,说明它确实在此处引用了构造函数。 A::A a; // error, A::A is not a type name 嗯...看看 C++14 标准,上面的措辞似乎是 DR 的主题,因为它现在显示为:lookup in which function names are not ignored33并且嵌套名称说明符指定了一个类 C: 并带有一些稍后的措辞/i>。我对我记得的规则的理解似乎是错误的,gcc 就在这里[反对clangVS,与xlC 和Solaris 的CC 一致——我刚刚尝试过] ... (33 note 提到了忽略函数的三种情况:nested-name-specifier (即DD::SS::DD 中的SS) 详细类型说明符(即class DD::SS)或基本说明符struct X : DD::SS

以上是关于Visual Studio 2012 中的奇怪错误的主要内容,如果未能解决你的问题,请参考以下文章

不在 UI 中的 Visual Studio 构建错误

奇怪的 Visual Studio 2012 异常:无法使用文本编辑器

奇怪的 Visual Studio 2008 C++ 编译器错误

Visual Studio 2012 中的远程调试

为 Visual Studio 2013 构建 ImageMagick

Visual Studio 2010 在编译 C++/CLI 项目时出现奇怪的错误