4

テンプレートクラスから継承しています。教員クラスにエントリーしたら教科クラスにもエントリーしたいし、逆もまたしかり。エラー Invalid use of incomplete type struct Subect; が表示されます。

void addSubject(Subject *s) {
            this->addReference(s);
            s->addReference(this); when I comment this line the it compiles without errors, but I cannot insert into Subject 

        }

私のコード全体は以下のとおりです

#include <iostream>
#include <stdlib.h>
#include <vector>

using namespace std;
class Subject;


template <class T>
class abstractReference {


    vector<T*> list;
    public:
    string code;
        void addReference(  T*);
        void delReference(  T*);
        bool hasReference(  T*);
        T * getReference(int );
};

template <class T>
void abstractReference<T>::addReference(T* ref) {
    list.push_back(ref);
    //ref->addReference(this);
}

template <class T>
void abstractReference<T>::delReference(T* ref) {
    int i;
    for (i=0; i<list.size(); i++) {
        if (list[i]== ref) list.erase(i);
    }

}

template <class T>
bool abstractReference<T>::hasReference( T* ref) {
  if (list.size() == 0) return false;
  int i;
  for (i=0; i<list.size(); i++) {
      if (list[i] == ref) return true;
  }
  return false;
}

template <class T>
T* abstractReference<T>::getReference(int i) {
    if (i < 0 || i > list.size()) return NULL;
    return list[i];
}

class Teacher : public abstractReference<Subject> {

    string fname;
    string lname;
    float  sal;
public:
    Teacher(string c, string fn, string ln, float s): fname(fn), lname(ln), sal(s) {
    }
    Teacher() {sal =0; fname=""; lname="";}
    void setInfo(string c, string fn, string ln, float s=0.00) {
        code=c;
        fname = fn;
        lname = ln;
        sal = s;
    }

    string getName() {
        return fname + " " + lname;
    }

    float getSal() {
        return sal;
    }

    void addSubject(Subject *s) {
        this->addReference(s);
        s->addReference(this);

    }

    void delSubject(Subject *s) {

    }

};

class Subject : public abstractReference<Teacher> {
  string title;
public:
  Subject(string c=NULL, string t=NULL) {
      title = t;

  }
  string getTitle() {
      return title;
  }
};

main() {
    Teacher *t;
    t = new Teacher("J109", "Dexter", "McConnell",15000);
    Subject *s, *s1, *s2;
    s= new Subject("E001", "English");
    s1= new Subject("M001", "Maths");
    s2= new Subject("s001", "Science");

    t->addSubject(s);
    t->addSubject(s1);

    cout << "Has Reference " << t->hasReference(s2) << endl;
    cout << "Done..." << endl;
    cout << t->getReference(1)->getTitle() << endl;
}
4

2 に答える 2

2

問題は、コンパイラが type を理解していないことSubjectです。おそらく、それを前方宣言したか、それを定義するヘッダー ファイルをインクルードするのを忘れていました。
その結果、コンパイラSubject不完全な型であり、 のレイアウトを知る必要のある操作を実行できませんSubject。メンバー関数の呼び出しは、そのようなインスタンスの 1 つです。

解決策は次のとおりです。

Subject次の定義があるソースcppファイルで 定義するヘッダーファイルを含める必要があります。

void addSubject(Subject *s)

複数のファイルがない場合は、関数を定義する前にSubjectクラスが定義されていることを確認してください。addSubject()

于 2012-04-23T05:57:15.993 に答える
1

コンパイラがクラスをコンパイルしようとすると、TeacherクラスSubjectはまだ定義されておらず、宣言されているだけです。そのため、コンパイラはSubjectまだどのメソッドが存在するかを知りません。

私の提案は、関数の本体をの定義のSubjectに移動することです。

このようなもの:

class Teacher : public abstractReference<Subject> {
    // ...

    void addSubject(Subject *s);

    // ...
};

class Subject : public abstractReference<Teacher> {
    // ...
};

void Teacher::addSubject(Subject *s) {
    // ...
}
于 2012-04-23T05:58:49.870 に答える