C++ C++;11,使用vs typedef,模板化
而不是C++ C++;11,使用vs typedef,模板化,c++,templates,c++11,typedef,using,C++,Templates,C++11,Typedef,Using,而不是 typedef struct { double x,y; } Point; C++11支持 using Point = struct {double x, y;}; 不幸的是,这种方法不适用于T类型 template <typename T> using Point = struct {T x, y;}; 模板 使用Point=struct{tx,y;}; 有没有办法解决这个问题?在这种情况下,您想使用类型别名的原因是什么? 在C++中,如果避免预先添加结构> /C
typedef struct
{
double x,y;
} Point;
C++11支持
using Point = struct {double x, y;};
不幸的是,这种方法不适用于T类型
template <typename T>
using Point = struct {T x, y;};
模板
使用Point=struct{tx,y;};
有没有办法解决这个问题?在这种情况下,您想使用类型别名的原因是什么? 在C++中,如果避免预先添加<代码>结构> /COD>关键字,则不是这样。 您可以直接定义它们:
struct Point{double x,y;}代码>
与模板案例相同:
template <typename T>
struct Point { T x, y; };
模板
结构点{tx,y;};
在这种情况下,是否有理由使用类型别名?
在C++中,如果避免预先添加<代码>结构> /COD>关键字,则不是这样。
您可以直接定义它们:struct Point{double x,y;}代码>
与模板案例相同:
template <typename T>
struct Point { T x, y; };
模板
结构点{tx,y;};
使用点=
是一个类型别名(正式称为“别名”)。也就是说,这只是typedef
的不同语法,其中所涉及的类型在中命名
模板使用点=
是一个别名模板,其中所涉及的类型在…
中再次命名
别名和别名模板的共同点是都必须引用类型id(C++11[basic.scope.pdecl]p3)。类型ID必须依次命名类型。(如图所示。)
问题在于,template struct{T x,y;}
不是一个类型,而是一个类模板,而且正如刚刚建立的别名模板必须引用类型一样。至于更改代码以解决问题,我不知道,因为您没有说明它是什么…;-]关于这一点,请参见使用点=
是一个类型别名(正式称为“别名”)。也就是说,这只是typedef
的不同语法,其中所涉及的类型在中命名
模板使用点=
是一个别名模板,其中所涉及的类型在…
中再次命名
别名和别名模板的共同点是都必须引用类型id(C++11[basic.scope.pdecl]p3)。类型ID必须依次命名类型。(如图所示。)
问题在于,template struct{T x,y;}
不是一个类型,而是一个类模板,而且正如刚刚建立的别名模板必须引用类型一样。至于更改代码以解决问题,我不知道,因为您没有说明它是什么…;-]关于这一点,请参见我有点不同意其他答案中的语言律师,所以我决定写我自己的
简而言之,您不能使用
使用Point=struct{tx,y;}的模板出于同样的原因,您不能使用模板结构{tx,y;}代码>
别名模板仍然是一个模板。尽管标准没有明确说明这一点,但它意味着模板应该有一个名称(请参见[temp]/4-模板名称有链接…)。你没有提供
因此,如果不提供名称,就无法“解决问题”。但您也不能像这样在别名声明中抛出名称:template using Point=struct P{T x,y;}代码>。该标准明确禁止它([dcl.typedef]/2-定义类型id的定义类型说明符seq不应定义类或枚举)
您唯一能做的事情如下所示:
template <typename T>
struct Point {T x, y;};
template <typename T>
using PointAlias = Point<T>;
模板
结构点{tx,y;};
样板
使用PointAlias=点;
正如您所看到的,这是毫无意义的(当然,除非您的点
接受多个模板参数;在本例中,您可以创建一个漂亮的别名模板)
因此,坚持使用简单的模板结构点{tx,y;}代码>。它的功能与您的“建议”语法完全相同。我有点不同意其他答案中的语言律师,所以我决定写自己的
简而言之,您不能使用
使用Point=struct{tx,y;}的模板出于同样的原因,您不能使用模板结构{tx,y;}代码>
别名模板仍然是一个模板。尽管标准没有明确说明这一点,但它意味着模板应该有一个名称(请参见[temp]/4-模板名称有链接…)。你没有提供
因此,如果不提供名称,就无法“解决问题”。但您也不能像这样在别名声明中抛出名称:template using Point=struct P{T x,y;}代码>。该标准明确禁止它([dcl.typedef]/2-定义类型id的定义类型说明符seq不应定义类或枚举)
您唯一能做的事情如下所示:
template <typename T>
struct Point {T x, y;};
template <typename T>
using PointAlias = Point<T>;
模板
结构点{tx,y;};
样板
使用PointAlias=点;
正如您所看到的,这是毫无意义的(当然,除非您的点
接受多个模板参数;在本例中,您可以创建一个漂亮的别名模板)
因此,坚持使用简单的模板结构点{tx,y;}代码>。它的功能与“建议的”语法完全相同。但是。。。但是为什么。。。你为什么要这么做?即使是你原来的typedef
也毫无意义(名字有点讽刺)。。。但是为什么。。。你为什么要这么做?即使是你原来的typedef
也毫无意义(名字有点讽刺)。@ildjarn:谢谢你的解释。@ildjarn:谢谢你的解释。