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" 语法完全相同。