0

私はプログラミングとC++の両方の初心者です。以前にテンプレートを使用したことがありますが、非常に限られた方法で、何が間違っているのかわかりません。

template <typename TElement>
struct list{    // if I try list<TElement> => list is not a template
    TElement data;
    struct list *next;
} node_type;    // also tried node_type<TElement>, other incomprehensible errors
node_type *ptr[max], *root[max], *temp[max];

私はエラーが少し理解できないと思います:"node_type does not name a type"
私は何を間違っていますか?

私がやろうとしていること:
タイプのリストが必要なので(これをいくつかの完全に異なる抽象データタイプ-ADTで使用できるように)、次のようなものになりたいと思います:

Activities list *ptr[max], *root[max], *temp[max]

それが意味を成す場合(どこActivitiesにクラスがありますが、他のクラスにすることができます)。

4

2 に答える 2

5

これを試して:

template <typename TElement>
struct node{   
    TElement data;
    node* next;
};    

node<int>* ptr[max], *root[max], *temp[max];

追加の提案: 標準 C++ ライブラリの型の後にカスタム型の名前を付けることは避けてください ( listvectorqueue... これらはすべて namespace にありますstd)。紛らわしく、名前の衝突が発生する可能性があります(どこにでも明示的に使用する必要がある独自の名前空間に配置しない限りusing namespace std;)。

于 2012-05-29T15:50:35.587 に答える
2

試行錯誤して構文を推測して C++ を学ぼうとするのではなく、良い本を読んでください。

template <typename TElement>
  struct list{

これは、テンプレートをインスタンス化する型のエイリアス (テンプレートの本体内のみ) として機能listする単一のテンプレート パラメーターを持つという struct テンプレートを宣言します。TElement

インスタンス化する場合はlist<int>TElementを参照しintます。インスタンス化する場合はlist<char>TElementを参照しcharます。等

TElementしたがって、テンプレートをインスタンス化するタイプは、テンプレート定義で置き換えられます。

試したときに得たエラー:

// if I try list<TElement> => list is not a template
template <typename TElement>
  struct list<TElement> {

これは有効な構文ではないためです。エラーは、listあなたが書いた時点でまだlist<TElement>宣言を終えていないため、テンプレートではないことを示しlistているため、コンパイラはそれが何であるかを認識せず、リストを作成できませんリスト テンプレートが定義されていない場合の何かの。

template <typename TElement>
  struct list{
    TElement data;
    struct list *next;
  }node_type;

listこれは、次の構文と同様に、 type のオブジェクトを宣言しようとします:

struct A {
  int i;
} a;        // the variable 'a' is an object of type 'A'

しかし、あなたの場合listはタイプではなく、テンプレートです。 list<int>は型ですがlist、それ自体は有効な型ではありません。「空白を埋める」ときに型を作成できるテンプレートにすぎません。つまり、パラメーターの代わりに型を提供します。TElement

とにかく変数を宣言しようとさえしていなかったようで、やみくもに構文を推測しているだけです。

// also tried node_type<TElement>, other incomprehensible errors

それも役に立ちません。node_type<TElement>ナンセンスです。変数を宣言したい場合は、型が必要list<int>です。パラメータは型に置き換えるTElement必要があります。それ自体は型ではありません。うまくいくことを期待して、構文のランダムなビットをつなぎ合わせようとするのはやめてください。http://www.parashift.com/c++-faq/templates.htmlを読むことから始めることができます

最後の行で:

node_type *ptr[max], *root[max], *temp[max];

node_typeタイプではないので、うまくいきません。また、1 行で複数の変数を宣言するという悪い習慣に陥らないようにする必要があります。次のように書く方がはるかに明確です。

int* p1;
int* p2;

それ以外の

int *p1, *p2;

また、ポインターの配列が必要ですか? 自分が何をしているのかはっきりとわからないので、作業を行う標準のコンテナ タイプを使用する方が賢明です。

于 2012-05-29T16:17:31.467 に答える