typedef类Smth是什么意思?

时间:2012-08-12 20:42:59

标签: c++ templates typedef

刚刚看到here

以前从未见过这样的建筑,我不明白,这意味着什么!以及它如何在专业化中工作,因为typedef不会生成新类型:

错:

template <typename T>
void a();
typedef int a_t;
typedef int b_t;
template<> void a<a_t>(){}
template<> void a<b_t>(){}

编译警告:'typedef' was ignored in this declaration,按预期工作:

template <typename T>
void a();
typedef class a_t;
typedef class b_t;
template<> void a<a_t>(){}
template<> void a<b_t>(){}

3 个答案:

答案 0 :(得分:4)

它没有任何意义,你最好不要写它。如果需要,请为typedef指定正确的名称

typedef class a_t a_t;
但是,我认为没有任何好处。最近改为C ++的AC程序员可能倾向于这样做,因为在C中你不能通过简单地命名它来引用类名(“C”中的“标签”),但是你必须在它前面添加标签类型(“struct a_t”或“union a_t”)或者为它创建一个typedef。然而,即使在这种情况下,程序员也会忘记以后的名字:)

在C ++中不需要。在C ++中,typedef名称和类名称的存在不能通过将这些名称保存在不同的“名称空间”中来解决(可以说,在C语言中。每个“名称空间”都有一种“语法指导消歧”。所以你可以说“foo”和“struct foo”和“goto foo”,每次“foo”可能是一个完全不同的实体)。在C ++中,typedef名称将替换纯类名,因此名称“a_t”都是 - typedef名称和类名。

至于Standardese,我们有一个问题,请参阅http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#157

答案 1 :(得分:1)

这不是标题中问题的答案(约翰内斯在这一点上的解释是明确的),而是对你所看到的失败的解释。

您的第一组代码失败的原因是因为a_tb_t属于同一类型(int),因此您创建了a<int>的两个定义,这就是编译器所抱怨的。

在第二个示例中,您声明了两种不同的类型(每种类型都是不同class的名称)。因此,您要创建两个不同的函数a<a_t>a<b_t>

答案 2 :(得分:1)

我终于没有理解,它是如何运作的。

typedef class a_t;

不像

typedef int a_t;

但是喜欢

typedef int;

所以,我转发声明class a_t然后typedef将它转发给任何人。它还解释了警告`typedef' was ignored in this declaration和所有与模板相关的内容。