Что не так? was not declared in this scope

192
12 января 2017, 05:39

Смущает меня в первую очередь то что рядом два очень похожих объявления, одно с ошибкой другое без.

ошибка: ‘ContactFaceElement’ was not declared in this scope
     QList<ContactFaceElement *> face;
           ^~~~~~~~~~~~~~~~~~
ошибка: template argument 1 is invalid
     QList<ContactFaceElement *> face;
                               ^

#ifndef ORGANISATIONELEMENT_H
#define ORGANISATIONELEMENT_H
#include <QObject>
#include <elementDB/contactfaceelement.h>
#include <elementDB/geoelement.h>
#include <QStringList>
class OrganisationElement : public QObject
{
  Q_OBJECT
public:
  explicit OrganisationElement(QObject *parent = 0);
  class element
  {
    QString name;
    QList<ContactFaceElement *> face; // ОШИБКА ЗДЕСЬ
    QList<GeoElement *> geo;
    QStringList sites;
    QStringList phone;
  };
  bool findOrganisation(OrganisationElement::element);
  bool findOrganisationFromEmail(QString);
  QList<OrganisationElement::element*> elements;
signals:
public slots:
};
#endif // ORGANISATIONELEMENT_H

! два класса

#ifndef CONTACTFACEELEMENT_H
#define CONTACTFACEELEMENT_H
#include <QObject>
#include <elementDB/geoelement.h>
#include <QDate>
#include <QStringList>
#include <elementDB/organisationelement.h>
class ContactFaceElement : public QObject
{
  Q_OBJECT
public:
  explicit ContactFaceElement(QObject *parent = 0);
  class element
  {
    QString name;
    QString last_name;
    QString patronymic;
    QDate birthday;
    GeoElement * geo;
    QStringList phone;
  };
  bool findContactFace(ContactFaceElement::element);
  bool findContactFaceFromEmail(QString);
  QList<ContactFaceElement::element *> face;
  QList <int> id_contact_face;
  void readListIdContactFace_FromOrganisation(OrganisationElement*);
signals:
public slots:
private:
  void readListIdContactFace_Email(QString);
  void addIdContactFace(int);
};
#endif // CONTACTFACEELEMENT_H
#ifndef GEOELEMENT_H
#define GEOELEMENT_H
#include <QObject>
#include <QStringList>
class GeoElement : public QObject
{
  Q_OBJECT
public:
  explicit GeoElement(QObject *parent = 0);
  class g
  {
    public:
    QString city;
    QString country;
    QString region;
    QString state;
    int zip_code;
    QString street;
    int home;
    QString home_word;
    int box;
    int box_word;
    QString currency_code;
    QString currency;
    int id_countries;
    int id_cities;
    bool biggest_city;
    int id_rayon;
    QString rayon;
  };
  bool findGeo(GeoElement::g);
  bool findGeoFromEmail(QString);
  QList<GeoElement::g*> geos;
  QList<int> id_geo;

signals:
public slots:
private:
  int idGeoInfoEmail(int);
  int idGeoList(int);
  void addGeosFromId(int);
};
#endif // GEOELEMENT_H
Answer 1

Ошибка возникает из-за того, что где-то contactfaceelement.h используется раньше, чем organisationelement.h. Из-за этого компилятор не находит декларацию класса ContactFaceElement

Используйте predeclaration в organisationelement.h

#ifndef ORGANISATIONELEMENT_H
#define ORGANISATIONELEMENT_H
#include <QObject>
#include <elementDB/contactfaceelement.h>
#include <elementDB/geoelement.h>
#include <QStringList>
// Добавьте предварительное объявление класса
class ContactFaceElement;
class OrganisationElement : public QObject
{
  Q_OBJECT
  // Дальше ваш код
};

Но вам надо разобраться в порядке использования includ-ов в остальных хидерах

READ ALSO
Как прикрутить QScroller к QTabBar&#39;у QTabWidget&#39;а

Как прикрутить QScroller к QTabBar'у QTabWidget'а

Необходимо, чтобы в Android приложении, можно было скроллить вкладкиДелается сейчас это так:

168
makefile. Запуск сервера и клиента

makefile. Запуск сервера и клиента

ПриветЕсть следующая структура:

137
Подключение dll к проекту Qt5

Подключение dll к проекту Qt5

Мне необходимо использовать функционал Windows Event LogДля доступа к функция данного API нужно добавить dll к проекту

131