1

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

我的一个班级收到错误“没有命名类型”,这让我很困惑。我知道我可以通过拼写错误或循环包含来解决这个问题,但在我的代码中找不到这些问题。SdlWindow.cpp 中的前向声明没有帮助。再次包含标题(所以我 /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'没有命名类型”,在 SdlWindow.cpp 中,我声明了两个 SdlWindow 函数。是什么原因造成的,我该如何解决?

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

4

3 回答 3

5

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

我怀疑你以某种方式设法使SdlWindow.cpp你的项目的一部分,即你试图自己编译SdlWindow.cpp的,作为一个普通的源文件。由于显而易见的原因,这将不起作用。如果您尝试实现仅头文件库,则不应将该库中的任何文件编译为普通源文件。

当然,另外一点,这整个事情不会像现在看起来那样工作。仅标头库不能包含非内联非模板函数。它适用于 Boost,因为在 Boost 中,函数是模板。您的函数不是模板。然后你必须声明它们inline,否则你的每个函数都会出现多重定义错误。

于 2011-04-04T02:49:45.720 回答
0

你需要#include <WBS/SdlWindow.hpp>SdlWindow.cpp.

于 2011-04-04T02:34:17.913 回答
0

正如 Sam 所说,您需要包含WBS/SdlWindow.hppfrom SdlWindow.cpp,但您也不需要SdlWindow.cpp从其标题中包含(这是一件等待发生的坏事)。

于 2011-04-04T02:40:18.087 回答