Доброго времени. Столкнулся со следующей проблемой при написании библиотеки не могу реализовать метод класса в файле .cpp - выдает ошибку, что мол тип данных State не верен. Код для foo.h Код (C++): #ifndef Foo_h #define Foo_h #include "Arduino.h" class Foo{ public: Foo (); enum State{ A, B, C, D }; State physState(){return State::B;}; }; #endif код для foo.cpp Код (C++): #include "Arduino.h" #include "Foo.h" Foo::Foo(){}; //State Foo::physState(){return State::B;}; При такой реализации метода ( в файле .h) проблем с типами не возникает, но если реализацию делать как положено в файле .cpp, то возникает ошибка при компиляции. файл .h Код (C++): #ifndef Foo_h #define Foo_h #include "Arduino.h" class Foo{ public: Foo (); enum State{ A, B, C, D }; State physState(); }; #endif файл .cpp Код (C++): #include "Arduino.h" #include "Foo.h" Foo::Foo(){}; State Foo::physState(){return State::B;}; ОШИБКА: S:\arduino\DATAArduino\libraries\FOO\Foo.cpp:5:1: error: 'State' does not name a type State Foo:hysState(){return State::B;}; Подскажите пожалуйста в чем дело?
из рабочего: Код (C++): enum class enumClassState: uint8_t {Unknown=0, Normal, Error}; class TClass { private: enumClassState fstate; public: enumClassState getState() const; } cpp файл: enumClassState TClass::getState() const{ return fstate; }
Перечисление объявили внутри класса, а ссылаетесь без класса. Код (C++): Foo::State Foo::physState() { return Foo::State::B; }; Или декларацию перечисления выносите за пределы класса.
Вот спасибо Вам! Добрый человек. Помогло! Из сказанного Вами я понял что при определении нового типа данных в классе, в последующем нужно указывать из какого класса этот тип?
В общем случае это относится ко всему, что объявляется внутри декларации класса, за исключением не статических полей и методов (надеюсь ни чего не упустил). Вот в класе Foo объявлен конструктор. Соответственно за пределами декларации класса на этот конструктор ссылаются вместе с именем класа. Что видно в *.cpp файле: Код (C++): Foo::Foo(){};