Я пытаюсь что-то выяснить в VCVRack.
В Template.hpp
using namespace rack;
...
struct SlowSliderWidget : public OpaqueWidget {
void draw(NVGcontext *vg) override;
};
затем в MyWidget.cpp
#include "Template.hpp"
namespace rack {
void SlowSliderWidget::draw(NVGcontext *vg) {
nvgBeginPath(vg);
nvgRect(vg, 0, 0, 100, 100);
nvgFill(vg);
}
} // namespace rack
Это дает мне следующую ошибку компилятора:
g++ -Wsuggest-override -std=c++11 -DSLUG=Template -fPIC -I../../include -I../../dep/include -DVERSION=0.6.0 -MMD -MP -g -O3 -march=nocona -ffast-math -fno-finite-math-only -Wall -Wextra -Wno-unused-parameter -DARCH_LIN -c -o build/src/MyWidget.cpp.o src/MyWidget.cpp
src/MyWidget.cpp:6:43: error: definition of ‘void SlowSliderWidget::draw(NVGcontext*)’ is not in namespace enclosing ‘SlowSliderWidget’ [-fpermissive]
void SlowSliderWidget::draw(NVGcontext *vg) {
^
../../compile.mk:64: recipe for target 'build/src/MyWidget.cpp.o' failed
Теперь, просматривая, я нахожу различные жалобы на этот тип ошибки в GCC.
Но все они, похоже, касаются попыток переопределить значение одного и того же имени класса в одном и том же пространстве имен.
Но если я понимаю мой C ++ здесь, я НЕ пытаюсь переопределить имя. Я объявляю имя SlowSliderWidget и SlowSliderWidget :: draw в файле Template.hpp и просто пытаюсь определить тело функции draw в файле MyWidget.cpp.
Так почему я получаю сообщение об ошибке? Формулировка, кажется, подразумевает, что я не в том же пространстве имен. Но в обоих файлах я в стойке пространства имен. Не я?