2013-03-25 4 views
2

Я новичок в C++ и в своем вступительном слове к классу разработки и концепции программирования мы теперь находимся на графике. Я мог делать программы только с FLTK, но мы должны использовать библиотеку Bjarne, такую ​​как GUI.h, , Simple_window.h, Point.h. Простая программа, как простая программа окна не будет компилировать и дает обычный ответ:Ошибки библиотеки Stroupstrup Ошибки

Simple_window.h:17: error: reference to ‘Window’ is ambiguous 

Я также попытался компиляции с помощью:

fltk-config --compile main.cpp 

Это дает те же результаты.

Я попытался запустить файл make, который Bjarne предоставил в папке, но всегда появляется с ошибками и не делает файлов .o.

Примечание: Кроме того, я пытался компиляции на Mac OSX и Ubuntu.

+0

: нет @ Крис, он не связан с FLTK, насколько я знаю. Но в своей книге «Принципы программирования и практика с использованием C++» он использует его. И он написал свои собственные вспомогательные файлы, чтобы упростить процесс его использования. http://www.stroustrup.com/Programming/Graphics/ –

+0

@BenjaminLindley, Ну, это проясняет, спасибо. – chris

+0

Держите осторожнее. Bjarne Stroustrup находится на Stackoverflow, и он может действительно увидеть этот вопрос. –

ответ

5

Я никогда не использовал ни одну из этих библиотек, но я видел, что учебники для FLTK всегда начинаются с инструкции using namespace fltk;, которая импортирует все классы FLTK, включая fltk::Window в корневое пространство имен.

Библиотека Б. Страуступа содержится в пространстве имен Graph_lib, а также имеет класс Window. Теперь файл Simple_window.h имеет оператор using namespace Graph_lib; в начале, который импортирует Graph_lib::Window в корневое пространство имен. И здесь возникает двусмысленность.

Так что я хотел бы предложить, чтобы опустить using заявление (по крайней мере, от using namespace fltk) и использовать классы FLTK с полной спецификации (например, fltk::Window вместо просто Window). Это должно устранить двусмысленность.

В качестве примечания, это хороший пример, почему наличие using namespace на уровне файла в файле заголовка - плохая идея.

Ссылки:
http://www.fltk.org/doc-2.0/html/index.html http://www.stroustrup.com/Programming/Graphics/Simple_window.h

EDIT: Я пытался скомпилировать библиотеку, содержащую Simple_window себя и, по крайней мере под Linux, то неоднозначность, кажется, между классом Graph_lib::Window из библиотеки и ЬурейеЕ Window из xlib. xlib - это библиотека C, и вы ничего не можете с этим поделать, поэтому вам придется избавиться от using namespace Graph_lib в библиотеке Stroustup.

В файле Simple_window.h:

  • удалить using namespace Graph_lib;
  • изменение Window к Graph_lib::Window
  • Button к Graph_lib::Button
  • и Address к Graph_lib::Address

Тогда в файле Simple_window.cpp:

  • изменения Address к Graph_lib::Address снова
  • и reference_to<Simple_window> к Graph_lib::reference_to<Simple_window>

Затем он должен собрать. Если у вас есть другая версия, отличная от той, что находится на сайте stroustrup.com, вам может потребоваться полностью квалифицировать (добавить Graph_lib::) больше классов.

+0

Это действительно странно, я просто пытался проверить программу, в которой ничего не было. Проблемы с неоднозначностью, похоже, поступают из файлов заголовков. Похоже, что должен быть способ скомпилировать исходный код заголовков или что-то в этом роде. – user2205853

+0

Также попробовал скомпилировать каждый файл cpp, который соответствовал файлам заголовков, и один из 4 из них был скомпилирован. Что-то вроде > g ++ -o Simple_window.o Simple_window.cpp пронизано множеством ошибок неправильных ссылок. Нужно ли размещать их в определенной папке? – user2205853

+0

Вижу. Он также сталкивается с «Xlib». Я отредактировал ответ, чтобы это отразить. – v154c1

0

Я просто имел такие же проблемы (неразрешенных внешних символов), используя Simple_window.h и пытается скомпилировать следующий мир кода:

int main(){ 

    // create a reference point for the window 
    Point topLeft(50,50); 
    // initialize a Simple_window object to size: 600x400 pixels, labeled: My window 
    Simple_window myWindow(topLeft, 600, 400, "My window"); 
    // pass control to GUI 
    myWindow.wait_for_button(); 

    return 0; 
    } 

Решение было добавить в проект (вместе с main.cpp) все соответствующие .cpp файлы включенных .h файлов :("Graph.h", "Window.h", "Simple_window.h", "GUI.h")