“using =”和“using”有什么区别?

时间:2015-02-15 21:20:31

标签: c++

我知道最明显的差异;即。 using允许您为引入的类型指定新名称,但以下两个语句之间有什么区别:

template <typename T>
class Derived : public X<T>
{
  using Base = X<T>;
  using Type = typename Base::Type; // statement 1
  using typename Base::Type; // statement 2
};

我注意到有时声明二没有按预期工作。例如,我可能会收到类似&#34;错误的错误:没有名为&#39; Type&#39;在X&#34;

那么这些陈述有何不同?

2 个答案:

答案 0 :(得分:4)

using T1 = T2;是新的(从C ++ 11开始)语法,它提供了typedef的替代方法。 using Type = typename X::Type;typedef typename X::Type Type;完全相同。

using typename X::Type;是较旧的语法,专门用于从基类继承成员。通常情况下,typename会是多余的,通常您可以编写using X::Type;,但对于模板基类,您可能需要typename来阻止X::Type从被解析为非类型成员。

它们不同的一个例子是

struct A {
  typedef int i;
};

struct B {
  using i = typename A::i; // valid
  using typename A::i; // invalid, A is not a base class of B
};

答案 1 :(得分:1)

第一个表单为类型引入了新名称,它是typedef的替代语法。

第二种形式重新声明了在当前范围内使用的名称。即,它从当前范围内可用的另一个范围中命名,例如, using std::swap表示您只能说swap而不是std::swap