而不是
typedef struct
{
double x,y;
} Point;
C ++ 11支持
using Point = struct {double x, y;};
不幸的是,这种方法不适用于类型T
template <typename T>
using Point = struct {T x, y;};
有没有办法解决问题?
答案 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;完全相同。语法。