使用类和命名空间的差异/歧义

4

我只是好奇为什么要使用指令来设计。因为 1)结构体被视为命名空间,而 2)却不是这样:

struct foo
{
  using type0 = int;
};

namespace bar
{
  using type1 = int;
}

using bar::type1; 
using type0 = foo::type0; // 1)
using foo::type0;         // 2)

clang version 3.3 (branches/release_33 186829)
clang -std=c++11 test.cpp
test.cpp:13:12: error: using declaration can not refer to class member
using foo::type0;

~~~~~^

gcc version 4.8.1
c++ -std=c++11 test.cpp
test.cpp:13:12: error: ‘foo’ is not a namespace
using foo::type0;

1) 是一个typedef,2) 是一个using声明。它们不是同一件事。 - Praetorian
但是在 typedef 中,1) 将 foo 视为命名空间以声明 type0 形式的类型,foo 结构中的所有类型都在 foo 命名空间内,而不在全局命名空间内。 - Artur Bac
  1. 是一种类型别名 - 就像 typedef...
- krsteeve
1个回答

11

类不是名称空间,它们有严格的范围。访问类成员(在类外部访问时)时,类成员的名称必须始终以类名为前缀。

using 不允许更改这一点。

之所以 #1 起作用是因为你创建了一个到类中声明的类型的类型别名(type alias)。这就是 using name = typename; 的做法。在这种情况下,它与 typedef 没有任何区别。

#2 不会创建别名;该语法会期望给出一个名称空间中的名称,并将其引入当前名称空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接