首页 > 解决方案 > GCC:“BLAH 的定义不在命名空间中”

问题描述

我试图在 VCVRack 中找出一些东西。

在模板.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 的函数体。

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

标签: c++namespaces

解决方案


推荐阅读