c++ - 仅 header 库中的 "Does not name a type"

标签 c++ class header include header-only

我正在尝试为自己编写一个仅包含 header 的辅助函数库。 (我正在使用 boost 和 SDL,而 boost 更容易使用,所以我想为我自己的帮助程序库模拟它。)

我的其中一个类(class)出现错误“没有命名类型”,这让我很困惑。我知道我可以通过拼写错误或循环包含来解决这个问题,但在我的代码中找不到这些问题中的任何一个。 SdlWindow.cpp 中的前向声明没有帮助。再次包含 header (所以我/do/有一个循环包含)也无济于事(我得到“先前定义的”错误)。

主要.cpp:

#include <WBS/SdlWindow.hpp>

int main(int argc, char **argv) {
    WBS::SdlWindow myWindow("Test window", 640, 480);
    return 0;
}

SdlWindow.hpp:

#ifndef SDLWINDOW_HPP_
#define SDLWINDOW_HPP_

#include <string>

#include <SDL/SDL.h>

namespace WBS {

class SdlWindow {
public:
   //Member Variables
   SDL_Surface *screen;
   int xSize;
   int ySize;

   //Constructor and Destructor
    SdlWindow(std::string title, int xSize, int ySize);
    virtual ~SdlWindow();

    //Member Functions
};

}

#include "SdlWindow.cpp"

#endif /* SDLWINDOW_HPP_ */

和 SdlWindow.cpp:

#include <string>

namespace WBS {

SdlWindow::SdlWindow(std::string title, int xSize, int ySize) {
    this->xSize = xSize;
    this->ySize = ySize;

   SDL_Init(SDL_INIT_VIDEO);

   screen = SDL_SetVideoMode(xSize, ySize, 32, SDL_ANYFORMAT);

   SDL_WM_SetCaption("Simple Window", "Simple Window");
}

SdlWindow::~SdlWindow() {
   SDL_FreeSurface(screen);
    SDL_Quit();
}

}

我在 SdlWindow.cpp 中得到的错误是“SdlWindow' does not name a type”,我在其中声明了两个 SdlWindow 函数。是什么原因造成的,我该如何解决?

我正在 Windows Vista 上的 Eclipse 中使用 mingw32 的 gcc 进行编译。

最佳答案

我明白你在做什么:只有 header 的库意味着 .cpp 文件包含在 .h 文件中,而不是相反(这当然,很多人会感到困惑)。但是如果你这样做,那么你不应该尝试将你的 .cpp 文件编译为普通的源文件。事实上,给您的 .cpp 文件一个不同的扩展名可能是一个更好的主意:例如,可能是 .hpp

我怀疑您以某种方式设法使 SdlWindow.cpp 成为您项目的一部分,即您正在尝试编译您的 SdlWindow.cpp 本身,作为一个普通的源文件。由于显而易见的原因,这将行不通。如果您正在尝试实现一个仅包含 header 的库,那么该库中的任何文件都不应编译为普通源文件。

当然,另外要注意的是,这整个事情不会像现在这样运作。仅 header 库不能包含非内联非模板函数。它适用于 Boost,因为在 Boost 中,函数是模板。您的功能不是模板。然后您必须声明它们内联,否则您最终会遇到每个函数的多重定义错误。

关于c++ - 仅 header 库中的 "Does not name a type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5533919/

相关文章:

css - 删除导航和标题之间的小间隙

c++ - 多重继承模板的成员函数歧义

c++ - 如何为 python 包装一个 c++ 库?

c++ - 重新定义类构造函数错误

java - 我怎样才能改进这段代码,这样就不会因为有多个同名对象而出现错误?

添加节标题后,Swift CollectionView 停止显示

c++ - 单张图像的相机校准?它似乎有效,但我错过了什么吗?

c++ - 哪个更好,一个类(class)中的一个类(class)还是一个单独的类(class)?

java - 从另一个类调用类

php - 防止站点导航重叠标题