【问题标题】:Stroupstrup Graphics Library ErrorsStroupstrup 图形库错误
【发布时间】:2013-03-14 10:05:03
【问题描述】:

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

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

我也试过编译使用:

fltk-config --compile main.cpp

这会产生相同的结果。

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

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

【问题讨论】:

  • @chris:不,据我所知,他没有参与 FLTK。但是在他的《使用 C++ 的编程原理和实践》一书中,他使用了它。并且他编写了自己的帮助文件来简化使用它的过程。 stroustrup.com/Programming/Graphics
  • @BenjaminLindley,那就清楚了,谢谢。
  • 嘘小心点。 Bjarne Stroustrup 在 Stackoverflow 上,他实际上可能会看到这个问题。

标签: c++ graphics fltk


【解决方案1】:

我刚刚使用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;
    }

解决方案是将包含的.h 文件的所有相应.cpp 文件添加到项目中(连同main.cpp):("Graph.h""Window.h""Simple_window.h""GUI.h" )

【讨论】:

    【解决方案2】:

    我从未使用过这两个库,但我看到 FLTK 教程总是以 using namespace fltk; 语句开头,它将所有 FLTK 类(包括 fltk::Window)导入到根命名空间。

    B. Stroustrup 的库包含在名为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 库,你不能对它做任何事情,所以你必须摆脱 Stroustup 库中的using namespace Graph_lib

    在文件Simple_window.h

    • 删除using namespace Graph_lib;
    • Window 更改为Graph_lib::Window
    • ButtonGraph_lib::Button
    • AddressGraph_lib::Address

    然后在文件Simple_window.cpp:

    • 再次将Address更改为Graph_lib::Address
    • reference_to<Simple_window>Graph_lib::reference_to<Simple_window>

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

    【讨论】:

    • 真的很奇怪,我只是想测试一个在main函数中什么都没有的程序。歧义问题似乎来自头文件。似乎应该有一种方法可以编译标头的源代码或其他东西。
    • 也只是尝试编译与头文件相对应的每个cpp文件,并且编译了其中的四分之一。 >g++ -o Simple_window.o Simple_window.cpp 之类的东西充斥着大量错误引用的错误。我需要将它们放在某个文件夹中吗?
    • 我明白了。它也与Xlib 发生冲突。我编辑了答案以反映这一点。
    • 不幸的是,这些都不能解决原帖中提到的问题
    猜你喜欢
    • 1970-01-01
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多