使用现有命名空间类型的声明与创建类型别名
Using-declaration of an existing namespace type vs creating a type alias
这不是关于 using
和 typedef
之间创建类型别名的区别的问题。我想提供从代码块或函数内的命名空间访问现有类型的权限。
我发现了两种不同的方法:
我可以 "include" 使用 using 声明的类型 :
using typename mynamespace::mytype;
或者我可以创建类型别名:
typedef mynamespace::mytype mytype;
using mytype = mynamespace::mytype; //C++11
- 有什么不同吗?
- 每种语法的优缺点是什么?
- 哪个最多used/recommended?
谢谢。
相关问题:Using-declaration of an existing type from base class vs creating a type alias inside child class
Is there any difference ?
命名空间中名称的类型别名可以出现在class
中
struct S { using mytype = mynamespace::mytype; };
而 using 声明可能不会。
What are the pros and cons of each syntax ?
如果您正在处理 class 范围,那么前一点是一个相当大的骗局。
除此之外,这两种方法非常相似。别名是一个新名称,它完全代表被别名的类型。而 using 声明将类型的现有名称带入范围。如果您对两者都使用 mytype
,您将不会注意到差异。
Which one is the most used/recommended ?
我怀疑是否就此达成共识。必要时使用必须使用的那个(class 范围),但在其他情况下请遵守团队的风格指南。
我发现这两种语法之间的另一个区别:无法在同一范围内定义与现有名称空间同名的类型别名。
namespace name1 {
struct name2 {};
}
namespace name2 {
struct name3 {};
}
//error: 'typedef struct name1::name2 name2' redeclared as different kind of symbol
/* typedef name1::name2 name2; */
//OK
using typename name1::name2;
//error: 'name2' does not name a type
/* name2 val1 = {}; */
//OK disambiguation with keyword "struct"
struct name2 val2 = {};
//OK namespace qualifier with "::"
name2::name3 val3 = {};
int main(){
//OK different scope
typedef name1::name2 name2;
name2 val = {};
}
这不是关于 using
和 typedef
之间创建类型别名的区别的问题。我想提供从代码块或函数内的命名空间访问现有类型的权限。
我发现了两种不同的方法:
我可以 "include" 使用 using 声明的类型 :
using typename mynamespace::mytype;
或者我可以创建类型别名:
typedef mynamespace::mytype mytype;
using mytype = mynamespace::mytype; //C++11
- 有什么不同吗?
- 每种语法的优缺点是什么?
- 哪个最多used/recommended?
谢谢。
相关问题:Using-declaration of an existing type from base class vs creating a type alias inside child class
Is there any difference ?
命名空间中名称的类型别名可以出现在class
中struct S { using mytype = mynamespace::mytype; };
而 using 声明可能不会。
What are the pros and cons of each syntax ?
如果您正在处理 class 范围,那么前一点是一个相当大的骗局。
除此之外,这两种方法非常相似。别名是一个新名称,它完全代表被别名的类型。而 using 声明将类型的现有名称带入范围。如果您对两者都使用 mytype
,您将不会注意到差异。
Which one is the most used/recommended ?
我怀疑是否就此达成共识。必要时使用必须使用的那个(class 范围),但在其他情况下请遵守团队的风格指南。
我发现这两种语法之间的另一个区别:无法在同一范围内定义与现有名称空间同名的类型别名。
namespace name1 {
struct name2 {};
}
namespace name2 {
struct name3 {};
}
//error: 'typedef struct name1::name2 name2' redeclared as different kind of symbol
/* typedef name1::name2 name2; */
//OK
using typename name1::name2;
//error: 'name2' does not name a type
/* name2 val1 = {}; */
//OK disambiguation with keyword "struct"
struct name2 val2 = {};
//OK namespace qualifier with "::"
name2::name3 val3 = {};
int main(){
//OK different scope
typedef name1::name2 name2;
name2 val = {};
}