Я новичок в C ++ и в моем вступлении к программированию и классу концепций мы сейчас находимся на графике. Я был в состоянии делать программы только с FLTKбиблиотека, но мы должны использовать библиотеку Бьярне, такую как GUI.h
, Graph.h
, Simple_window.h
, Point.h
, Простая программа, такая как простая оконная программа, не компилируется и дает обычный ответ:
Simple_window.h:17: error: reference to ‘Window’ is ambiguous
Я также попытался с помощью компиляции:
fltk-config --compile main.cpp
Это дает те же результаты.
Я попытался запустить файл make, который Бьярне предоставил в папке, но он всегда приводит к ошибкам и не делает .o
файлы.
Примечание: я также пробовал компилировать на Mac OSX а также Ubuntu.
Я никогда не использовал ни одну из этих библиотек, но я видел, что учебные пособия по 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
РЕДАКТИРОВАТЬ: Я пытался скомпилировать библиотеку, содержащую Simple_window
я и, по крайней мере, под Linux, это двусмысленность, кажется, между классом Graph_lib::Window
из библиотеки и typedef Window
из xlib также. xlib — это библиотека C, и вы ничего не можете с этим поделать, поэтому вам придется избавиться от using namespace Graph_lib
в библиотеке Страуступа.
В файле 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::
) больше классов.
У меня просто были такие же проблемы (нерешенные внешние символы) с использованием 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"
)