Qt - moc, вызывающий C2504: базовый класс не определен - PullRequest
3 голосов
/ 14 сентября 2011

У меня проблема, которую я пытался решить какое-то время, но я совершенно ошарашен.Итак, у меня есть два класса, X и Y, и у каждого из них есть свои собственные файлы заголовков, Xh и Yh. Каждый является Q_OBJECT и имеет это определение макроса в файле заголовка.,Определение X гласит:

class X: public QGLWidget {Q_OBJECT ...}

Когда я компилирую, X.cpp и Y.cpp компилируются правильно, и на этом этапе проблем нет.Файлы moc также генерируются без проблем.

Однако, когда стандартный процесс сборки QT идет на компиляцию moc_X.cpp, он выдает «C: \ path \ Yh (34): ошибка C2504:« X »: базовый класс не определен».Но этого не происходит при компиляции Y.cpp или X.cpp, это происходит только при компиляции файлов moc!Есть идеи?То, что сборка будет терпеть неудачу на стадии moc и только на стадии moc, кажется чрезвычайно странной.Помощь очень ценится!

1 Ответ

7 голосов
/ 14 сентября 2011

Я попытался воспроизвести его с описанием, которое вы даете, и не смог.

Итак, вот вещи, которые стоит проверить:

ошибки во включенных охранниках?

Убедитесь, что вы случайно не получили 2 включающих охранников с одинаковыми именами в 2 разных заголовках (т. е. строки #ifndef X_H и #define X_H)

(это, вероятно, менее вероятно из вашего описания: было бы более вероятно, если бы ошибка была при компиляции moc_Y.cpp)

форвардные объявления для типов, используемых в сигналах или слотах?

Иногда для параметра в сигнале или слоте может потребоваться включение дополнительного заголовка.

Лучший способ объяснить это - сказать, что бывают случаи, когда ваш заголовок будетхорошо с предварительным объявлением классу, но moc может генерировать код, который должен фактически создать или уничтожить тип, который ваш заголовок только объявит вперед.

Если это так, то естьспособ добавить код в .ui, that запрашивает включение дополнительного заголовка для заранее объявленного типа.Но самое простое решение - просто заменить предварительное объявление соответствующим заголовком, внутри Xh или Yh

проверьте содержимое файла moc_X.cpp

Есливыше не помогает, и если вы еще этого не сделали, я бы предложил открыть нарушающий moc файл и прочитать код.Как только вы увидите, что он делает, он может дать вам некоторые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...