我正在尝试为自己编写一个仅包含头文件的辅助函数库。 (我正在使用boost和SDL,并且boost更容易使用,所以我想模仿我自己的帮助库。)
我的某个课程收到错误“不为某个类型命名”,这让我感到困惑。我知道我可以通过拼写错误或循环包含来解决这个问题,但在我的代码中找不到这些问题。 SdlWindow.cpp中的前向声明没有帮助。再次包括标题(所以I / do /有一个循环包含)也没有帮助(我得到“以前定义的”错误)。
Main.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'没有命名类型”,在SdlWindow.cpp中,我声明了两个SdlWindow函数。造成这种情况的原因是什么?如何解决?
我正在Windows Vista上使用Eclipse中的mingw32 gcc进行编译。
答案 0 :(得分:5)
我看到你要做的事情:仅限标题的库意味着.cpp
文件包含在.h
文件中,而不是相反(当然,这对许多人来说很困惑)人)。但是,如果你这样做,那么你不应该尝试将.cpp
文件编译为普通的源文件。事实上,为.cpp
文件提供不同的扩展名可能更好一点:例如,.hpp
可能是一个例子。
我怀疑你以某种方式设法使SdlWindow.cpp
成为你项目的一部分,即你正在尝试编译你自己的SdlWindow.cpp
作为一个普通的源文件。这显然不会起作用。如果您正在尝试实现仅标头库,则不应将该库中的任何文件编译为普通源文件。
当然,另外需要注意的是,这一切都不会像现在这样发挥作用。仅标头库不能包含非内联非模板函数。它适用于Boost,因为在Boost中,函数是模板。您的功能不是模板。您必须先声明它们inline
,否则您的每个函数都会出现多重定义错误。
答案 1 :(得分:0)
您需要#include <WBS/SdlWindow.hpp>
中的SdlWindow.cpp
。
答案 2 :(得分:0)
你需要在WBS/SdlWindow.hpp
中添加SdlWindow.cpp
,正如Sam所说,但你也不需要在其标题中包含SdlWindow.cpp
(这是一个错误等待发生的事情。)