在标题库中“不命名类型”

时间:2011-04-04 02:08:47

标签: c++ class header 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;
}

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进行编译。

3 个答案:

答案 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(这是一个错误等待发生的事情。)