Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > [Qt] ISO C++ forbids или проблеммы с классами


Автор: kefir01 10.10.2010, 04:04
Здравствуйте, господа знатоки! =)

Чует мое сердце, что буду бит за сей вопрос, но что-то никак не вопру в чем проблема.

Глядите, есть унаследованный от QGraphicsView класс QGSMap, а в нем - унаследованный от QGraphicsItem класс QGSLayer:

qgsmap.h
Код

#define QGSMAP_H

#include <QGraphicsView>
#include "qgsmap/qgslayer.h"

class QGSLayer;

class QGSMap : public QGraphicsView
{
    Q_OBJECT

public:
    explicit QGSMap(QWidget *parent = 0);

    QList<QGSLayer*> getLayers();
    QGSlayer* getLayer(int index);

...


qgsmap/qgslayer.h (qgsmap - папка)
Код

#ifndef QGSLAYER_H
#define QGSLAYER_H

#include <QGraphicsItem>

class QGSLayer : public QGraphicsItem
{
    Q_OBJECT
public:
    QGSLayer();
    virtual ~QGSLayer();
};

#endif // QGSLAYER_H



В награзу за труды я получаю ISO C++ forbids declaration of 'QGSlayer' with no type
Вроде и forward declaration сделал и указатели использую...

Буду рад если выявите и поясните наличие фундаментальных заблуждений в объявлении классов (если таковые имеются).

Заранее спасибо!

Автор: boostcoder 10.10.2010, 05:54
Цитата(kefir01 @  10.10.2010,  04:04 Найти цитируемый пост)
#include "qgsmap/qgslayer.h"

попробуй закомментируй.
если в файле qgsmap.h используешь только указатели на него, то этого не нужно.

Добавлено через 43 секунды
Цитата(kefir01 @  10.10.2010,  04:04 Найти цитируемый пост)
получаю ISO C++ forbids declaration of 'QGSlayer' with no type

покажи полный вывод компилятора.

Автор: SABROG 10.10.2010, 10:15
Код

QGSlayer* getLayer(int index);


Тут "l" маленькая, а должна быть большая "L", опечатка.

Автор: kefir01 10.10.2010, 12:20
Нда надо спать больше))  smile 

Спасибо!

Задам тогда другой вопрос - как избежать 
Код

 invalid conversion from 'QGraphicsItem* const' to 'QGSLayer*'

?

В смысле - как избежать ручного переделывания конструкций типа:
Код

    foreach(QGSLayer *itm, items())
    {
        if(itm->topLevelItem() == itm)
            list.append(itm);
    }

где items() - QList<QGraphicsItem*>

Или здесь только влезание в qgraphicsitem.h поможет?

Автор: SABROG 10.10.2010, 18:08
Я бы не рекомендовал использовать foreach, если планируется изменять данные в контейнере. Кроме того foreach создает временную копию всего контейнера, поэтому возвращаемые элементы идут как const.

Автор: kefir01 10.10.2010, 23:52
Окей буду знать, спасибо)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)