刚刚看到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>(){}
答案 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_t
和b_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
和所有与模板相关的内容。