GCC:“ BLAH的定义不在命名空间中”

时间:2019-01-17 19:45:58

标签: c++ namespaces

我正在尝试找出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 ++,我不会尝试重新定义名称。我在Template.hpp文件中声明了SlowSliderWidget和SlowSliderWidget :: draw的名称,我只是尝试在MyWidget.cpp文件中定义draw的函数体。

那我为什么会收到错误消息?该措辞似乎暗示我不在同一个命名空间中。但是在这两个文件中,我都在命名空间机架中。我不是吗?

0 个答案:

没有答案