2016-08-24 4 views
0

Возьмите следующие 2 примера ниже:Декларирование перечисления в начале класса против конца

struct Coord 
{ 
private: 
    enum class Origin 
    { 
     Top_Left = 0, 
     Center 
    }; 
public: 
    Coord(Origin origin = Origin::Top_Left) 
    {} 
}; 


int main() 
{ 
} 

Запуск этого выше, я не получаю никаких ошибок. С другой стороны, когда я запускаю это, я получаю следующую ошибку.

struct Coord 
{ 
public: 
    Coord(Origin origin = Origin::Top_Left) 
    {} 
private: 
    enum class Origin 
    { 
     Top_Left = 0, 
     Center 
    }; 
}; 


int main() 
{ 
} 

7:16: error: expected ')' before 'origin'

Кроме того, в Visual Studio 2015, я получаю сообщение об ошибке для идентификатора Origin не найден в конструкторе.

Почему это?

Ошибка здесь: Live Example

+0

@crashmstr^Аналогично –

+0

Но согласно ¶9.4.3 книги Бьярн Стуррупа, PPP 4th edition: компилятор не заботится о порядке функции класса и данных; Он принимает декларации в любом порядке, который вы хотите представить. Нарушает ли класс перечисления? –

+4

@LogicStuff Вы * можете * на самом деле переслать объявление * строго типизированный enum * s ("enum class") в C++ 11 и более поздних версиях. –

ответ

2

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

Компилятор должен знать, что Origin и Origin::Top_Left перед его использованием в документе Coord(Origin origin = Origin::Top_Left). Помните; компилятор анализирует ваш код сверху вниз. Он должен знать, какие типы являются, прежде чем они будут использованы. Это не просмотр всей единицы компиляции в целостном застои. Язык просто работает так: «должен знать, что происходит до того, как материал используется, и я читаю сверху вниз в каждом файле». Иногда «знание материала» должно быть полным определением, иногда достаточно прямого объявления (подробности этого не входят в сферу применения этого вопроса).

+0

Я не думаю, что это сделает передовая декларация ('enum class Origin;'). И «Origin», и «Origin :: Top_Left» должны быть видимыми. –

+0

Возможно, вы правы - звучит правдоподобно. Я признаю, что на самом деле я не проверял это дело. –

+0

И проблемная часть - «Origin :: Top_Left». – Jarod42

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