«Не называет тип» в библиотеке только для заголовка - PullRequest
1 голос
/ 04 апреля 2011

Я пытаюсь написать библиотеку вспомогательных функций только для заголовков для себя. (Я использую boost и SDL, и boost намного проще в использовании, поэтому я хочу подражать этому для моей собственной вспомогательной библиотеки.)

Я получаю ошибку "Не называет тип" для одного из моих классов, и это меня смущает. Я знаю, что могу решить эту проблему с ошибкой или циклическим включением, но не могу найти ни одной из этих проблем в своем коде. Форвардное объявление в SdlWindow.cpp не помогает. Повторное включение заголовка (поэтому я / делаю / имею круговое включение) также не помогает (я получаю «ранее определенные» ошибки).

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. Что вызывает это и как я могу это исправить?

Я компилирую с gcc mingw32 в Eclipse в Windows Vista.

Ответы [ 3 ]

5 голосов
/ 04 апреля 2011

Я вижу, что вы пытаетесь сделать: библиотека только для заголовка подразумевает, что файл .cpp включен в файл .h, а не наоборот (это, конечно, сбивает с толку многих людей). Но если вы делаете это таким образом, вам не следует пытаться скомпилировать ваши .cpp файлы как обычные исходные файлы. На самом деле, может быть, лучше дать вашему файлу .cpp другое расширение: .hpp, возможно, для одного примера.

Я подозреваю, что вам каким-то образом удалось сделать SdlWindow.cpp частью вашего проекта, т. Е. Вы пытаетесь скомпилировать ваш SdlWindow.cpp как обычный исходный файл. Это не будет работать по понятным причинам. Если вы пытаетесь реализовать библиотеку только для заголовков , то никакие файлы из этой библиотеки не должны компилироваться как обычные исходные файлы.

Конечно, на дополнительном примечании все это не будет работать так, как выглядит сейчас. Библиотека только для заголовка не может содержать не встроенные не шаблонные функции. Это работает для Boost, потому что в Boost функции являются шаблонами. Ваши функции не являются шаблонами. Затем вы должны объявить их inline, иначе вы получите ошибки множественного определения для каждой из ваших функций.

0 голосов
/ 04 апреля 2011

Вам нужно включить WBS/SdlWindow.hpp из SdlWindow.cpp, как сказал Сэм, но вы также не должны добавить SdlWindow.cpp из заголовка (это плохая вещь, ожидающая того, что произойдет).

0 голосов
/ 04 апреля 2011

Вам нужно #include <WBS/SdlWindow.hpp> от SdlWindow.cpp.

...