我正试图弄清楚是否要针对Clang、GCC或两者提交错误报告(我已经针对Clang trunk和GCC 4.7.2进行了测试:如果有人可以针对GCC trunk验证这一点,那将会很有帮助):
基本上,以下代码三行文件在默认和C 11模式下仅使用-fsyntax
编译良好:
class A {
friend void f();
};
请注意,f()
没有预先声明,但这是明确确定的。
但是,Clang(但不是GCC)拒绝以下内容:
class A {
friend void ::f();
};
来自Clang的错误是“在指定范围内没有找到类型为'void()'的名为'f'的函数”,但我在标准中找不到任何理由来区别对待这种情况,所以我认为这是一个错误;我可能是错的(但是,我正在阅读N3242,其中AFAIK是C 11之前的最后一个公开草案)。
然而,下一个例子被GCC拒绝了,而不是Clang:
void f() { }
void g()
{
class A {
friend void ::f();
};
}
来自GCC的错误是“局部类中的友元声明' void f()'没有事先声明”,这似乎没有意义,因为< code>void ::f()应该引用全局命名空间中的< code>f(),它是声明的。(不要介意从一个局部类中< code >友元-调用一个全局函数是无意义的,它似乎并不违法...)
最后,最后一个示例被Clang和GCC拒绝:
void g()
{
class A {
friend void ::f();
};
}
错误分别是“在没有先前声明的本地类中的友元声明'void f()'”和“在指定范围内未找到名为'f'且类型为'void()'的函数”。现在,从11.4p11中,拒绝本地类中以前未声明的函数的友元声明似乎有一些道理,但该段实际上是这样的:
如果朋友声明出现在本地类(9.8)中并且指定的名称是不合格的名称,则在不考虑最内部封闭的非类范围之外的范围的情况下查找先前声明。对于朋友函数声明,如果没有先前声明,则程序格式错误...
这一声明的非法性显然是基于本段第二句话,但我不清楚这句话是否也应该适用于有条件的名称,就像本案中使用的那样。(可以说,无论是否使用“非限定名称”,整个段落都可能适用于“本地类”情况,并且“并且指定的名称是非限定名称”子句仅适用于第一句中描述的查找,但这似乎是一种延伸......我将此视为一种可能性的唯一原因是因为两个编译器都拒绝它。
无论如何,从我所能告诉你的,这四起案件(不管它们是否明智)都应该是合法的;即使不是这样,在第二和第三种情况下,Clang和GCC中至少有一种是错误的。有人能在我的逻辑中找到错误吗?
第三和第四种情况是毫无意义的;但我可以看到第二个案例破坏了某人的有效和有用的代码,所以我有点惊讶它从未被发现,如果它确实是一个bug的话。
我认为8.3/1中的这句话是相关的:
当声明符-id被限定时,声明应引用限定符所指的类或命名空间的先前声明的成员(或者,在命名空间的情况下,该命名空间(7.3.1)的内联命名空间集的元素)或其专业化;该成员不应仅由声明符-id的嵌套名称说明符指定的类或命名空间范围内的使用声明引入。
这一段讨论的是一般的声明符,在任何类型的声明中。所以我认为例子2和4格式错误,clang是正确的,gcc是错误的。
(如果全局声明是一个模板函数,则示例 3 可能会变得更加现实。将全局函数模板或局部类的特化设置为好友可能很有用。如果允许这样做,那么您编写的示例 3 也可能是合法的,以保持一致性。
问题内容: 就像标题所说的那样,有没有办法解决这个问题?我已经导入了两个单独的第三方库,它们具有完全限定的类名冲突。 现在,两个库都以jar形式导入,并且似乎在某些环境(命令行调用,Eclipse)中找到了正确的类,而在其他环境(Maven)中则找到了错误的类,并且我得到了缺少的方法异常。如果找不到解决方案,那么我可以回过头来重构这些库之一并重新构建jar,但是我宁愿不必在每次库更新时都重复该工作
假设我有一个类,,其构造函数采用目标名称。为了对这个类进行CDI验证,我可以编写一个类似这样的生成器,它检查注入点以找到一个名为的注释(不是限定符,因为生成器方法不能用它可以生成的所有可能的主题名值进行注释): 但是假设这个类很重,但是线程安全,因此应该尽可能多地共享。这意味着我希望任何看起来像的注入站点共享以FooBar作为名称构建的的相同实例。 我们不能将producer方法标记为Applic
问题内容: 在我的代码中,我有: 然后,编译器将说“ NameError:全局名称a()未定义”。如果我将所有东西都从A类中取出,那没问题,但是如何在A类中定义方法?非常感谢你。 问题答案: 你需要调用调用从。是 不是 一个全球性的功能,它是在类中的方法。 您可能想通读有关类的Python教程,以获得更详细的信息。
问题内容: 我在Mac OS X上使用Python 2.6.1。 我有两个简单的Python文件(如下),但是当我运行时 我在终端上: 我尝试以不同的方式重命名文件和类,这就是为什么两端有x和z的原因。;) 文件sqlitedbx.py 文件update_url.py 问题答案: 您需要做:
我有一个自动执行的函数,它包含很多东西,其中at函数是我想要全局化的。我通常只在全局范围内声明它,但它需要能够引用仅对自执行函数局部的变量。 在不完全去掉自执行函数(从而在全局空间中乱扔变量)的情况下,使函数全局可访问的最佳方法是什么?
案例1。类扩展了java。util。阵列列表{ { } } 这里我得到一个compiletime错误,表示找不到符号 案例2。类扩展了java。util。阵列列表 { } 这个正在成功编译。 那么扩展ArrayList类有什么必要呢?如果我们不能利用它(如案例1)