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 名とクラス名の両方になります。

標準化に関しては、これについて未解決の問題があります。 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#157を参照してください。

于 2012-08-12T20:45:20.217 に答える
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 に答える
1

これは、タイトルの質問に対する回答ではなく (ヨハネスの説明はこの点で明確です)、あなたが見た失敗の説明です。

コードの最初のセットが失敗する理由は、a_tb_tが同じ型 ( int) であり、 の 2 つの定義を作成しているためですa<int>

2 番目の例では、2 つの異なる型を宣言しています (それぞれが異なる の名前ですclass)。したがって、2 つの異なる関数を作成していa<a_t>ますa<b_t>

于 2012-08-12T20:49:05.553 に答える