1

刚才在这里看到了。

从来没有遇到过这样的结构,我不明白,这是什么意思!以及它在专业化中的工作方式,因为 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>(){}
4

3 回答 3

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

于 2012-08-12T20:45:20.217 回答
1

这不是对标题中问题的回答(约翰内斯对此的解释很清楚),而是对您所看到的失败的解释。

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

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

于 2012-08-12T20:49:05.553 回答
1

我终于明白了,它是如何工作的。

typedef class a_t;

不像

typedef int a_t;

但喜欢

typedef int;

所以,我转发了声明class a_t,然后typedef就一事无成。它还解释了警告`typedef' was ignored in this declaration 和所有模板相关的东西。

于 2012-08-12T21:01:12.783 回答