7

C では、構造体を宣言または定義するときはいつでも構造体プレフィックスを使用する必要があります。ただし、構造が c++ の一種のクラスになると、状況が変わります。struct構造体を宣言するときに接頭辞を使用する必要がなくなりました。Cこの流れで、 の構造体タグが の型の名前になったと思いC++ます。

structただし、プレフィックスを使用できないという意味ではありません。まだstructプレフィックスを使用できます。たとえば、c++ の作成者である Bjarne Stroustrup は、構造体をプレフィックス付きとstructプレフィックスなしで宣言する例を紹介していて、戸惑います。

以下は、テンプレート引数 T を持つ構造体を作成しようとする構造体定義です。これらはエラーなしで正常にコンパイルされます。

template<class T> struct linked_list {
    T element;
    linked_list<T> *next;
};
template<class T> struct linked_list {
    T element;
    struct linked_list<T> *next;
};

さて、以下は戻り値の型と引数の型が構造体である関数宣言です。これらは上記とそれほど違いはありませんが、以下の 2 つの関数宣言の最初のもので、構造体プレフィックスが付いているもので、Visual Studio c++ 2012 でエラーが発生します。

template<class T> struct linked_list<T> *add_list(T element, struct linked_list<T> *tail);
template<class T> linked_list<T> *add_list(T element, linked_list<T> *tail);

私は物事がどのように機能するかを本当に理解していません。これらの宣言の違いがわかりません。誰か詳細な説明をくれませんか?

4

2 に答える 2

-1

ご自身で説明されているので、よく理解しているようです。C++ では、キーワード struct はキーワード class と同じですが、プライベート メンバーではなくパブリック メンバーがデフォルトです。したがって、struct キーワードを使用してクラスを宣言した場合、そのクラスを参照するときにそれを再度使用することはありません。最初の例でCで使用されるように、構造体を使用しようとしているようです。これは、C++ の場合とは異なります。

于 2013-08-05T19:23:44.367 に答える