[英]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; };
struct Point { double x, y; };
。
与模板情况相同:
template <typename T>
struct Point { T x, y; };
using Point = ...;
是类型别名(通常仅称为“别名”)。 即,对于typedef
只是一种不同的语法,其中涉及的类型在...
命名。
template<typename T> using Point = ...;
是别名模板 ,其中涉及的类型再次在...
命名。
别名和别名模板的共同点是两者都必须引用类型ID (C ++ 11 [basic.scope.pdecl] p3)。 类型标识必须依次命名为type 。 (去搞清楚。)
的问题是, template<typename T> struct {T x, y;}
不是一个类型,但类模板,并且如刚刚建立别名模板必须引用类型。 至于改变你的代码,以解决您的问题,我不知道你有没有说什么它是...; - ]至于原因,请参见什么是XY问题?
我在其他答案中与语言律师有些不同,所以我决定自己写。
简而言之,您不能通过template <typename T> using Point = struct {T x, y;};
使用template <typename T> using Point = struct {T x, y;};
由于相同的原因,您不能使用template <typename T> struct {T x, y;};
。
别名模板仍然是模板。 并且尽管该标准没有明确说明,但它暗示模板应具有名称(请参阅[temp] / 4- 模板名称具有链接... )。 您没有提供的。
因此,不,您不能不提供名称就“解决问题”。 但是,您也不能只在别名声明中像这样抛出名称: template <typename T> using Point = struct P {T x, y;};
。 该标准明确禁止使用它([dcl.typedef] / 2- 定义类型标识的定义类型说明符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;};
。 它与“建议的”语法完全相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.