繁体   English   中英

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; }; 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM