Невозможно найти ожидаемое имя класса перед ошибкой токена '{' для решения - PullRequest
3 голосов
/ 28 ноября 2010

Это хорошо известная проблема, эта чертова ошибка

ожидаемое имя класса до '{' токена

Что ж, несмотря на свою усердную работу и поиск в Google, я не смог решить эту ошибку.Сожалею.Это мой последний берег.

В ui.cpp моего проекта я делаю:

#include "wfqueue_proxy_factory.hpp"

ОК, это вызывает глупую ошибку в моем компиляторе:

В файле, включенном из wfqueue_proxy_factory.hpp: 29, из ui.cpp: 28: wfqueue_manager_proxy.hpp: 42: ошибка: ожидаемое имя класса до '{' токена

Существует три классав моем проекте: Первый

// wfqueue_proxy_factory.hpp
#ifndef _WFQUEUE_PROXY_FACTORY_HPP
#define _WFQUEUE_PROXY_FACTORY_HPP
#include "wfqueue_manager_proxy.hpp"
// ...
class WFQueueProxyFactory {
//...
};
#endif

Второй

// wfqueue_manager_proxy.hpp
#ifndef _WFQUEUE_MANAGER_PROXY_HPP
#define _WFQUEUE_MANAGER_PROXY_HPP
#include "workflow.hpp"
#include "wfqueue.hpp"
// ...
class WFQueueManagerProxy : public WFQueue { // This is the problem (line 42)
//...
};
#endif

Третий

// wfqueue.hpp
#ifndef _WFQUEUE_HPP
#define _WFQUEUE_HPP
#include "workflow.hpp"
class WFQueue {
// ...
};
#endif

ПОЖАЛУЙСТА, ПОЖАЛУЙСТА, ОБРАТИТЕ ВНИМАНИЕ, что я использую;после каждого класса я проверял КАЖДЫЙ заголовок в своем проекте в поисках этой проблемы и не нашел ни одного класса, за которым не следовал бы;после закрывающей скобки.Это действительно для workflow.hpp, который является простым классом (не производным от какого-либо класса, просто классом).

WFQueue - это своего рода интерфейс, если я использую этот шаблон с другими классами, и они работают.WFQueue содержит некоторые виртуальные чистые методы ... проблема не должна быть здесь в любом случае .... Я предполагаю, что это потому, что я использую другой класс "interface" с другими классами, и они работают нормально.

Эта ошибка исчезает, если я делаюэто:

// wfqueue_manager_proxy.hpp
#ifndef _WFQUEUE_MANAGER_PROXY_HPP
#define _WFQUEUE_MANAGER_PROXY_HPP
#include "workflow.hpp"
#include "wfqueue.hpp"
// ...
class WFQueueManagerProxy {
//...
};
#endif

Не знаю, как решить эту проблему ... пожалуйста, помогите мне.Спасибо

Ответы [ 5 ]

4 голосов
/ 28 ноября 2010

Вы должны запустить препроцессор в вашем коде, но не скомпилировать его и проверить результат.Для этого скопируйте команду, которая запускает сбойную компиляцию, и в большинстве компиляторов вы удалите параметр -o outfile и добавите что-то вроде -E (см. Документацию вашего компилятора для флага, который выполняет только предварительную обработку).*

Компилятор выдаст (на stdout) весь модуль перевода со всеми #include и таким разрешенным, так что вы можете ясно увидеть, что отсутствует (просто найдите строку кода, соответствующую строке ошибки, а затем найдитепосмотри какие объявления ты найдешь).Если все еще не ясно, в чем проблема, запишите предварительно обработанный вывод в файл и попробуйте скомпилировать его.Затем вы можете настроить предварительно обработанный источник и посмотреть, что нужно для его исправления.

3 голосов
/ 28 ноября 2010

Просто дикая догадка: ваша ошибка говорит о том, что в

class WFQueueManagerProxy : public WFQueue { // This is the problem (line 42)
//...
};

должно быть имя класса перед {.Поэтому я предполагаю, что компилятор не знает, что WFQueue является классом.Вы уверены, что это определение включено?Я имею в виду, может быть, в wfqueue.hpp класс называется WfQueue или по-другому?

1 голос
/ 28 ноября 2010

Это то, чего никогда не было ... Боже мой, извини ... Кажется, что мой диск резервного копирования виртуальной машины столкнулся с оригинальным. Я запускаю свой проект на виртуальной машине, создавая резервную копию 2 часа назад, возможно, что-то испортилось ... Я настроил ее, и теперь виртуальная машина может найти правильную папку и правильные файлы для компиляции. Это было удивительно, ахаха и очевидно, что ols-файлы g ++ пытались скомпилировать там, где предыдущая версия была заполнена ошибками ... Это была одна из ошибок ... повторил защитный заголовок. Icecrime был прав ... несмотря на то, что я искал повторы в моих файлах, в предыдущей версии, где я не исправил эту проблему, были некоторые файлы, которые я вставил и забыл изменить защитный заголовок. Спасибо всем за ваше терпение и усилия. Извините, я не заметил этого очень странного столкновения виртуального диска на моей машине. Еще раз спасибо.

1 голос
/ 28 ноября 2010

Проблема может быть в неправильном включении охранников.Попробуйте проверить, действительно ли они уникальны для каждого файла.Кажется, вы сделали это, чтобы отключить определение WFQueue при компиляции WFQueueManagerProxy.

0 голосов
/ 19 мая 2017

Убедитесь, что вы ввели

using namespace omnetpp;

после включает. Это решило мою проблему.

...