我知道最明显的差异;即。 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; 。
那么这些陈述有何不同?
答案 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
。