2010-11-28 1 views
3

Это хорошо известная проблема эта проклятая ошибканевыполнима класс имя ожидаемый перед «{» маркера ошибки решить

ожидается имя класса, прежде чем «{» лексема

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

В ui.cpp проекта шахты я:

#include "wfqueue_proxy_factory.hpp" 

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

In file included from wfqueue_proxy_factory.hpp:29,from ui.cpp:28: wfqueue_manager_proxy.hpp:42: error: expected class-name before ‘{’ token

Есть три класса в моем проекте: Первый

// 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 

ПОЖАЛУЙСТА ПОЖАЛУЙСТА ПОЖАЛУЙСТА, обратите внимание, что я использую; после} каждого класса, я проверил EVERY заголовок в моем проекте, который искал эту проблему, и не нашел ни одного класса, за которым не последовало; после его закрывающей скобки. Это справедливо для workflow.hpp, который является простым классом (не производным от какого-либо класса, просто простого класса).

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

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

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

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

+0

Возможно, я пропустил это, но я не вижу ничего плохого в коде, который вы предоставили. Вы уверены, что ни один другой заголовочный файл не имеет такой же `_WFQUEUE_HPP`, который содержит защитник? – icecrime 2010-11-28 12:52:27

+0

АБСОЛЮТНО ни один другой файл не имеет этого – Andry 2010-11-28 13:18:17

+0

Что находится в `workflow.hpp`? – 2010-11-28 13:22:23

ответ

3

Просто дикое предположение: Ваша ошибка говорит, что в

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

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

+0

Спасибо, господин Цурунян ... Проблема была совсем другая ... к счастью, я мог заметить это ... очень странно ... прочитал мой asnwer и посмеюсь :) – Andry 2010-11-28 13:27:29

1

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

+0

Как вы можете видеть из моего ответа .. проблема была другой, но связана с той, которую вы мне рассказываете. Спасибо за ваши усилия. – Andry 2010-11-28 13:26:30

4

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

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

1

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

0

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

using namespace omnetpp; 

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

 Смежные вопросы

  • Нет связанных вопросов^_^