1

ヘルパー関数のヘッダーのみのライブラリを自分で作成しようとしています。(私はブーストとSDLを使用していますが、ブーストの方がはるかに使いやすいので、自分のヘルパーライブラリ用にそれをエミュレートしたいと思います。)

クラスの1つで「タイプに名前を付けていません」というエラーが表示され、混乱します。スペルミスまたは循環インクルードでこの問題が発生する可能性があることはわかっていますが、コードでこれらの問題のいずれも見つかりません。SdlWindow.cppでの前方宣言は役に立ちません。ヘッダーを再度インクルードする(つまり、/ 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.cppの「SdlWindow'は型に名前を付けていません」です。ここで、2つのSdlWindow関数を宣言します。これを引き起こしているのは何ですか?どうすれば修正できますか?

WindowsVistaのEclipseでmingw32のgccをコンパイルしています。

4

3 に答える 3

5

あなたがやろうとしていることがわかります。ヘッダーのみのライブラリは、.cppファイルがファイルに含まれていることを意味し.h、その逆ではありません(もちろん、これは多くの人にとって混乱を招きます)。ただし、そのようにしている場合は、.cppファイルを通常のソースファイルとしてコンパイルしようとしないでください。.cpp実際、ファイルに別の拡張子を付ける方がよい場合があります.hpp。たとえば、1つの例です。

どういうわけか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.cppSdlWindow.cpp

于 2011-04-04T02:40:18.087 に答える