C ++ 11,使用vs typedef,模板化

时间:2016-07-15 22:14:33

标签: 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;};

有没有办法解决问题?

3 个答案:

答案 0 :(得分:4)

在这种情况下,您是否有理由要使用类型别名? 如果要避免使用struct关键字,那么在C ++中则不是这样。

您只需直接定义它们:struct Point { double x, y; };

与模板案例相同:

template <typename T>
struct Point { T x, y; };

答案 1 :(得分:4)

using Point = ...;是一种类型别名(正式称为&#39;别名&#39;)。即,它只是typedef的不同语法,其中所涉及的类型在...中命名。

template<typename T> using Point = ...;是别名模板,其中涉及的类型再次在...中命名。

别名和别名模板的共同点是两者都必须引用 type-id (C ++ 11 [basic.scope.pdecl] p3)。 Type-ID必须依次命名 types 。 (去图。)

问题是template<typename T> struct {T x, y;}不是类型,而是类模板,并且刚建立的别名模板必须引用类型。至于更改代码以解决你的问题,我不知道你还没有说出它是什么......; - ]关于这一点,请参阅{{3} }

答案 2 :(得分:0)

我有点不同意其他答案中的语言律师,所以我决定自己编写。

总之,你不能使用 template <typename T> using Point = struct {T x, y;};出于同样的原因,您无法使用template <typename T> struct {T x, y;};

别名模板仍然是模板。虽然标准没有明确说明,但它暗示模板应该有一个名称(参见[temp] / 4 - 模板名称有链接...... )。你不提供的。

所以不,你不能解决问题&#34;没有提供名字。但是你也不能只在这样的别名声明中抛出一个名字:template <typename T> using Point = struct P {T x, y;};。标准明确禁止它([dcl.typedef] / 2 - define-type-id的define-type-specifier-seq不应定义类或枚举)。

你唯一能做的就是这样:

template <typename T>
struct Point {T x, y;};
template <typename T>
using PointAlias = Point<T>;

正如您所看到的,这是毫无意义的(当然,除非您的Point采用多个模板参数;在这种情况下,您可以创建一个漂亮的别名模板。)

坚持使用简单的template <typename T> struct Point {T x, y;};。它与您提出的&#34;&#34;完全相同。语法。