- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为自己编写一个仅包含 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/
我是一名优秀的程序员,十分优秀!