2

我是C++新手,在我的编程设计和概念介绍课程中,我们现在讨论图形。我已经能够仅使用FLTK的库制作程序,但我们必须使用 Bjarne 的库,例如GUI.h, Graph.h, Simple_window.h, Point.h。像简单窗口程序这样的简单程序不会编译并给出通常的响应:

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

我也试过编译使用:

fltk-config --compile main.cpp

这会产生相同的结果。

我尝试运行 Bjarne 在文件夹中提供的 make 文件,但总是出现错误并且不生成.o文件。

注意:我也试过在 mac OSXUbuntu上编译。

4

2 回答 2

6

我从未使用过这些库中的任何一个,但我看到 FLTK 的教程总是以using namespace fltk;语句开头,该语句导入所有 FLTK 类,包括fltk::Window到根命名空间。

B. Stroustrup 的库包含在名为的命名空间中Graph_lib,它还有一个名为 的类Window。现在,该文件在开头Simple_window.h有语句,该语句导入到根命名空间。这就是歧义的来源。using namespace Graph_lib;Graph_lib::Window

所以我建议省略该using语句(至少 from using namespace fltk)并使用具有完整规范的 FLTK 类(例如fltk::Window,而不是 just 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 下,它的歧义似乎在库中的类和xlib 中Graph_lib::Window的 typedef之间。Windowxlib 是 C 库,你不能对它做任何事情,所以你必须摆脱using namespace Graph_libStroustup 的库。

在文件中Simple_window.h

  • 删除using namespace Graph_lib;
  • 更改WindowGraph_lib::Window
  • ButtonGraph_lib::Button
  • Address_Graph_lib::Address

然后在文件中Simple_window.cpp

  • 再次更改AddressGraph_lib::Address
  • reference_to<Simple_window>_Graph_lib::reference_to<Simple_window>

然后它应该编译。如果您的版本与 stroustrup.com 上的版本不同,您可能需要完全限定(添加Graph_lib::)更多类。

于 2013-03-25T01:38:20.000 回答
0

I just had the same kind of problems (unresolved external symbols) using Simple_window.h and trying to compile a the following peace of code:

    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;
    }

The solution was to add to the project (along with the main.cpp) all the respective .cpp files of the included .h files:("Graph.h", "Window.h", "Simple_window.h", "GUI.h")

于 2015-08-29T18:44:24.620 回答