【发布时间】:2011-12-01 05:52:09
【问题描述】:
使用有什么区别
typedef Some::Nested::Namespace::TypeName TypeName;
或
using Some::Nested::Namespace::TypeName;
在本地范围内提供简写TypeName?
【问题讨论】:
使用有什么区别
typedef Some::Nested::Namespace::TypeName TypeName;
或
using Some::Nested::Namespace::TypeName;
在本地范围内提供简写TypeName?
【问题讨论】:
typedef 为该类型提供别名。
typedef Some::Nested::Namespace::TypeName TypeName;
完成此操作后,您只需在本地命名空间中输入 TypeName 即可引用 Some::Nested::Namespace::TypeName。
using declaration 使类型在当前命名空间中可见。
使用 Some::Nested::Namespace::TypeName;
导入当前命名空间中的类型。
在这种情况下,使用上述任一方法,您都可以通过在本地命名空间中使用 TypeName 来引用 Some::Nested::Namespace::TypeName。
【讨论】:
using 语句。
typedef一个专门的类型,比如vector<int>,你可以只在非专门的模板上使用using(例如vector)
typedef 在这种情况下不起作用,因为你必须使用using!
typedef 只适用于别名 types(顾名思义),所以当然不能导入其他任何东西。
使用只是将声明带入本地范围,而 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.
}
【讨论】:
它们有不同的起源和不同的用途。
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 共存,每个都有自己的猎场。
【讨论】:
using name = int; 在 C++11 中的格式不正确吗?