gpt4 book ai didi

c++ - 仅 header 库中的 "Does not name a type"

转载 作者:行者123 更新时间:2023-11-30 01:29:39 24 4
gpt4 key购买 nike

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

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

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

最佳答案

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

我怀疑您以某种方式设法使 SdlWindow.cpp 成为您项目的一部分,即您正在尝试编译您的 SdlWindow.cpp 本身,作为一个普通的源文件。由于显而易见的原因,这将行不通。如果您正在尝试实现一个仅包含 header 的库,那么该库中的任何文件都不应编译为普通源文件。

当然,另外要注意的是,这整个事情不会像现在这样运作。仅 header 库不能包含非内联非模板函数。它适用于 Boost,因为在 Boost 中,函数是模板。您的功能不是模板。然后您必须声明它们内联,否则您最终会遇到每个函数的多重定义错误。

关于c++ - 仅 header 库中的 "Does not name a type",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5533919/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com