C++11,使用 vs typedef,模板化
C++11, using vs typedef, templatized
而不是
typedef struct
{
double x,y;
} Point;
C++11 支持
using Point = struct {double x, y;};
不幸的是,这种方法不适用于类型 T
template <typename T>
using Point = struct {T x, y;};
有什么办法可以解决这个问题吗?
在这种情况下,为什么要使用类型别名是有原因的吗?
如果是为了避免在前面加上 struct
关键字,在 C++ 中就不是这样了。
您只需直接定义它们:struct Point { double x, y; };
。
同模板案例:
template <typename T>
struct Point { T x, y; };
using Point = ...;
是类型别名(正式名称为 'alias')。也就是说,它只是 typedef
的一种不同语法,其中涉及的类型在 ...
.
中命名
template<typename T> using Point = ...;
是别名 template,其中涉及的类型再次在 ...
.
中命名
别名和别名模板的共同点是都必须引用 type-id (C++11 [basic.scope.pdecl]p3)。 Type-id 必须依次命名为 types。 (去图。)
的问题是template<typename T> struct {T x, y;}
不是类型,而是class模板,而刚刚建立的别名模板必须引用类型。至于更改您的代码以解决 您的 问题,我不知道,因为您没有说它是什么......;-] 关于那个,请参阅 What is the XY problem?
我有点不同意其他答案中的律师语言,所以我决定自己写一个。
简而言之,您不能使用
template <typename T> using Point = struct {T x, y;};
出于同样的原因你不能使用 template <typename T> struct {T x, y;};
。
别名模板仍然是一个模板。尽管标准没有明确说明这一点,但它暗示模板应该有一个名称(参见 [temp]/4 - A template name has linkage ...)。你没有提供。
所以不,您不能 "resolve the problem" 不提供姓名。但是您也不能像这样在别名声明中只输入一个名称:template <typename T> using Point = struct P {T x, y;};
。标准明确禁止它([dcl.typedef]/2 - 定义类型 ID 的定义类型说明符序列不得定义 class 或枚举 ).
你唯一能做的就是看起来像这样:
template <typename T>
struct Point {T x, y;};
template <typename T>
using PointAlias = Point<T>;
如您所见,这是毫无意义的(当然,除非您的 Point
采用多个模板参数;在这种情况下,您可以制作一个漂亮的别名模板)。
所以坚持简单 template <typename T> struct Point {T x, y;};
。它与您的 "proposed" 语法完全相同。
而不是
typedef struct
{
double x,y;
} Point;
C++11 支持
using Point = struct {double x, y;};
不幸的是,这种方法不适用于类型 T
template <typename T>
using Point = struct {T x, y;};
有什么办法可以解决这个问题吗?
在这种情况下,为什么要使用类型别名是有原因的吗?
如果是为了避免在前面加上 struct
关键字,在 C++ 中就不是这样了。
您只需直接定义它们:struct Point { double x, y; };
。
同模板案例:
template <typename T>
struct Point { T x, y; };
using Point = ...;
是类型别名(正式名称为 'alias')。也就是说,它只是 typedef
的一种不同语法,其中涉及的类型在 ...
.
template<typename T> using Point = ...;
是别名 template,其中涉及的类型再次在 ...
.
别名和别名模板的共同点是都必须引用 type-id (C++11 [basic.scope.pdecl]p3)。 Type-id 必须依次命名为 types。 (去图。)
的问题是template<typename T> struct {T x, y;}
不是类型,而是class模板,而刚刚建立的别名模板必须引用类型。至于更改您的代码以解决 您的 问题,我不知道,因为您没有说它是什么......;-] 关于那个,请参阅 What is the XY problem?
我有点不同意其他答案中的律师语言,所以我决定自己写一个。
简而言之,您不能使用
template <typename T> using Point = struct {T x, y;};
出于同样的原因你不能使用 template <typename T> struct {T x, y;};
。
别名模板仍然是一个模板。尽管标准没有明确说明这一点,但它暗示模板应该有一个名称(参见 [temp]/4 - A template name has linkage ...)。你没有提供。
所以不,您不能 "resolve the problem" 不提供姓名。但是您也不能像这样在别名声明中只输入一个名称:template <typename T> using Point = struct P {T x, y;};
。标准明确禁止它([dcl.typedef]/2 - 定义类型 ID 的定义类型说明符序列不得定义 class 或枚举 ).
你唯一能做的就是看起来像这样:
template <typename T>
struct Point {T x, y;};
template <typename T>
using PointAlias = Point<T>;
如您所见,这是毫无意义的(当然,除非您的 Point
采用多个模板参数;在这种情况下,您可以制作一个漂亮的别名模板)。
所以坚持简单 template <typename T> struct Point {T x, y;};
。它与您的 "proposed" 语法完全相同。