Ang*_*fin 1 c++ header class include header-only
我正在尝试为自己编写一个仅限头文件的辅助函数库.(我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
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_ */
Run Code Online (Sandbox Code Playgroud)
和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();
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的错误是"SdlWindow'没有命名类型",在SdlWindow.cpp中,我声明了两个SdlWindow函数.造成这种情况的原因是什么?如何解决?
我在Windows Vista上用Eclipse编译mingw32的gcc.
我看到你要做的事情:一个只有标题的库意味着.cpp文件被包含在.h文件中而不是相反(当然,这对许多人来说很困惑).但是,如果你这样做,那么你不应该尝试将.cpp文件编译为普通的源文件.实际上,为.cpp文件提供不同的扩展名可能是一个更好的主意:.hpp例如,一个例子.
我怀疑你总算让SdlWindow.cpp你的项目的一部分,即你正在试图编译你的SdlWindow.cpp本身,作为一个普通的源文件.这显然不会起作用.如果您正在尝试实现仅限标头的库,则不应将该库中的任何文件编译为普通源文件.
当然,另外需要注意的是,这一切都不会像现在这样发挥作用.仅标头库不能包含非内联非模板函数.它适用于Boost,因为在Boost中,函数是模板.您的功能不是模板.您必须先声明它们inline,否则您的每个函数都会出现多重定义错误.
| 归档时间: |
|
| 查看次数: |
4745 次 |
| 最近记录: |