2015-09-06 4 views
2

Я следую за this question для повторения перечисления.Итерация над классом enum в проекте

enum class COLOR 
{ 
    Blue, 
    Red, 
    Green, 
    Purple, 
    First=Blue, 
    Last=Purple 
}; 

COLOR operator++(COLOR& x) { return x = (COLOR)(((int)(x) + 1)); } 

COLOR operator*(COLOR c) {return c;} 

COLOR begin(COLOR r) {return COLOR::First;} 
// end iterator needs to return one past the end! 
COLOR end(COLOR r) {return COLOR(int(COLOR::Last) + 1);} 

Проблема заключается в том, что в моем проекте, есть много cpp и hpp файлов, которые компилируются отдельно. Кажется, компилятор должен иметь прямой доступ к реализации operator++. Если я объявляю в hpp, а затем реализовать в cpp файле, я буду сталкиваться с ошибкой:

compiler warning: inline function ‘Color operator++(Color&)’ used but never defined

linker error: undefined reference to `operator++(instruction_type&)'

Если я определяю его непосредственно в hpp, я столкнусь с другой ошибкой

multiple definition of ...

для operator*, begin, и end в компоновщике.

ответ

2

Добавление ключевого слова inline перед вашими 4 функциями позволит им определить в заголовке без ошибок определения. Например:

inline COLOR operator*(COLOR c) {return c;} 

Или вы можете включить только прототип в файле .h и определяют функции в 1 .cpp файле.

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

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