使用
之间有什么区别typedef Some::Nested::Namespace::TypeName TypeName;
或
using Some::Nested::Namespace::TypeName;
在本地范围内提供简写TypeName
?
答案 0 :(得分:6)
typedef
为该类型提供别名。
typedef Some :: Nested :: Namespace :: TypeName TypeName;
完成此操作后,您只需在本地命名空间中说Some::Nested::Namespace::TypeName
即可引用TypeName
。
using declaration
使该类型在当前命名空间中可见。
使用Some :: Nested :: Namespace :: TypeName;
在当前命名空间中导入类型。
在这种情况下,使用上述任一方法,您只需在本地命名空间中使用Some::Nested::Namespace::TypeName
即可引用TypeName
。
答案 1 :(得分:6)
使用只将声明带入本地范围,而typedef引入 typedef-name 。它们之间的一个区别是详细说明的类型说明符,例如:
namespace n
{
class foo
{
};
}
typedef n::foo n_foo;
using n::foo;
int main()
{
class foo f1; // ok, declares f1 variable of type n::foo.
class n_foo f2; // error, typedef-name can't be used in elaborated-type-specifier.
}
答案 2 :(得分:6)
它们有不同的起源和不同的用途。
typedef
来自C
:回想一下声明结构的C语言是:
typedef struct _MyStruct { .... } MyStruct;
它允许您仅为类型引入别名。它可以用于函数的类型,具有笨拙的语法......
typedef void (*Func)(Foo, Bar);
其中Func
现在是一个指向函数的指针,该函数通过副本(分别为Foo
和Bar
类型)获取两个参数并且不返回任何内容。
using
最初有不同的含义。它意味着在范围中注入名称。可以注入任何名称(几乎):类型,函数,变量(但不是枚举值......)
使用C ++ 11,语法已得到增强,允许模板别名:
template <typename T>
using equiv_map = std::map<T,T>;
此加电using
表示现在可以使用别名(见下文),除了之前的功能之外。
这个C ++ 11的改变是语法协调的明确方向。请注意别名的定义现在与变量的定义类似:
<name> = <expression>;
不幸的是,标准似乎将此别名保留为模板情况,所以现在 typedef
和using
共存,每个都有自己的狩猎场。