命名空间与包含的类同名,gcc可以,clang不行
Namespace having the same name as contained class, ok for gcc, not ok for clang
考虑以下代码:
template<typename T>
class Foo{};
namespace X
{
class X{};
}
using namespace X; // now both class X and namespace X are visible
Foo<X::X> f()
{
return {};
}
int main() {}
gcc5.2编译代码时没有任何错误。然而clang吐出了错误:
错误:'X'不是类、命名空间或枚举Foo f()
错误:对'X'的引用有歧义
根据c++标准,代码在语法上是有效的吗?或者只是一个gcc bug?删除限定名X::X
并使用Foo<X>
将使gcc阻塞也
error:模板参数1无效Foo f ()
[namspace .udir]/6:
如果名称查找在两个不同的名称空间和声明不声明相同的实体如果不是声明函数,使用名称是错误的。
对于X::X
中的第一个X
,同时考虑命名空间和类。但是,命名空间的名称驻留在全局命名空间中,而类驻留在命名空间X
中;因此上述引用适用,因此Clang是正确的。(显然,当只写X
时也会出现这种情况)。
::X
消除了这种歧义。查找不再进入名称空间。(namespace.qual)/2:
对于名称空间
X
和名称m
,名称空间限定的查找集S(X, m)定义如下S0(X, m)是X
中m
的所有声明的集合和X
的内联命名空间集合(7.3.1)。如果S0(X, m)是非空, S (X, m) 是 S <子> 0 子> (X,米), 否则,[…]
这里,X
是全局命名空间,m
是"X"。显然,找到了名称空间的声明,因此这里的查找是明确的。
不是一个完整的答案,但这是一个清楚的情况,即使声明使用名称空间,对于与名称空间同名的对象,您也需要声明名称空间。
#include <iostream>
#include <string>
namespace test
{
void function1(void){std::cout << "Function inside the namespace" << std::endl;}
class test
{
public:
static void function1(void){std::cout << "Function inside the class" << std::endl;}
};
};
using namespace test;
int main()
{
function1();
test::function1();
test::test::function1();
}
输出(GCC 4.9.2)
"Function inside the namespace"
"Function inside the namespace"
"Function inside the class"
相关文章:
- 有了gcc,是否可以链接库,但前提是它存在
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 是否可以在gcc中只启用特定的C++语言功能
- 是否可以编译使用 .NET DLL 和 GCC 的C++?
- gcc 中的多个对齐属性是否可以用于保证缓存行分隔?
- 我可以在Windows(Visual C++)中读取bin文件,但不能在linux(GCC)上读取bin文件
- 是否可以在 GCC 中使用带有 C++17 的显式寄存器变量?
- GCC 仪器 - 是否可以自动输出函数的参数?
- gcc 可以使用较旧的第三方库编译 C++17 代码吗?
- 我可以禁用 GCC 的 assert() 的 noreturn 属性吗?
- 为什么GCC可以编译std::exception("some error msg")而没有错误?
- GCC可以优化具有编译时常量变量的类的方法吗
- GCC可以用于编译到自定义平台吗
- 当我在一个步骤中编译所有内容时,GCC 可以更好地优化事情吗?
- gcc可以编译varadic模板,而clang不能
- 命名空间与包含的类同名,gcc可以,clang不行
- GCC可以打印出中间结果
- GCC可以将类编译为结构体吗?
- GCC可以使用读-修改-写指令来更新易失性变量吗?
- GCC可以编译和运行源代码而不生成对象或可执行文件吗?