在标题库中"不命名类型"

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.

AnT*_*AnT 5

我看到你要做的事情:一个只有标题的库意味着.cpp文件被包含在.h文件中而不是相反(当然,这对许多人来说很困惑).但是,如果你这样做,那么你不应该尝试将.cpp文件编译为普通的源文件.实际上,为.cpp文件提供不同的扩展名可能是一个更好的主意:.hpp例如,一个例子.

我怀疑你总算让SdlWindow.cpp你的项目的一部分,即你正在试图编译你的SdlWindow.cpp本身,作为一个普通的源文件.这显然不会起作用.如果您正在尝试实现仅限标头的库,则不应将该库中的任何文件编译为普通源文件.

当然,另外需要注意的是,这一切都不会像现在这样发挥作用.仅标头库不能包含非内联非模板函数.它适用于Boost,因为在Boost中,函数是模板.您的功能不是模板.您必须先声明它们inline,否则您的每个函数都会出现多重定义错误.