【问题标题】:boost::geometry and std namespace conflict with Visual Studio 2013 [duplicate]boost::geometry 和 std 命名空间与 Visual Studio 2013 冲突 [重复]
【发布时间】:2015-06-25 02:26:38
【问题描述】:

我正在使用 Visual Studio 2013 并且向导创建了 Win32 控制台应用程序项目。这段代码:

    #include <boost/geometry.hpp>
    #include <boost/geometry/geometries/point_xy.hpp>

    using namespace std;
    using namespace boost::geometry;

    int main()
    {
        model::d2::point_xy<int> p1(1, 1), p2(2, 2);
        cout << "Distance p1-p2 is: " << distance(p1, p2) << endl;

        return 0;
    }

生成一个长模板 barf,以:

error C2039: 'iterator_category' : is not a member of 'boost::geometry::model::d2::point_xy<int,boost::geometry::cs::cartesian>'

相同的代码在 gcc 和 clang 上运行良好。我是否必须更改我的项目设置才能使其编译?

编辑

此代码在 Visual Studio 2015 CTP 上运行良好,因此问题是 VS2013 中的重载分辨率不足,正如 Marc Glisse 指出的那样。

using namespace std 不是juanchopanza 声称的问题的根源。认为这是一种不好的做法有点武断,因为有很多相反的论点(参见Why is “using namespace std;” considered bad practice? 的讨论)。在这种特定情况下,人们可以争辩说using namespace boost::geometry 是一种不好的做法,而不是using namespace std

由于存在先有鸡还是先有蛋的悖论,一些编辑从 stackoverflow 问题中删除所有冗余的要求将使搜索变得更加困难:在开始成功搜索之前,必须知道问题的答案。最终,您可以将整个 stackoverflow 减少到 42,但实用程序会受到影响。

【问题讨论】:

  • 哪一行导致了问题?
  • 我正在将“长模板 barf”添加到我的词典中。谢谢。
  • @JamesAdkison cout &lt;&lt; "Distance p1-p2 is: " &lt;&lt; distance(p1, p2) &lt;&lt; endl 是带有错误消息的行。
  • @PaulJurczak 标记为重复的帖子不会被删除,它们会被保留以便更容易在其他帖子中找到答案。 stackoverflow.com/help/duplicates
  • 这不是VS中的缺陷,只是在C++14(或更高版本,我不记得了)中这样指定。乘以 using namespace 仍然是个坏主意。

标签: c++ visual-studio boost namespaces boost-geometry


【解决方案1】:

std::distance 函数计算两个迭代器之间的距离。

尝试删除 using namespace std 或正确限定 boost distance 函数。

编辑

问题依然存在,为什么 gcc 和 clang 没有抱怨?

正如@MarcGlisse 指出的那样,其原因可能归结为 C++ 库实现所采用的复杂程度:

最新版本的 libstdc++ 和 libc++ 使用 sfinae

旧版本的 Visual Studio 还没有这样做

对于为什么它适用于某些编译器而不适用于其他编译器,这是一个非常合理的解释,因为 SFINAE 是一种从编译器将考虑的可能函数集中删除函数的机制。有关 SFINAE 的更多信息(cppreference.comWIKIPEDIA

【讨论】:

  • 不,还是同样的问题。
  • 使用boost::geometry::distance解决问题,谢谢。问题仍然存在,为什么 gcc 和 clang 没有抱怨?在用尽所有可能的选项之前,模板解析不应该继续吗?
  • @PaulJurczak 我不确定为什么它适用于那些编译器,但不适用于 Visual Studio 2013。似乎对于 Visual Studio,它并没有继续寻找,因为它找到了它想要的匹配,它只是选择的匹配不会编译(也许您在这些平台上包含的标头从不包含&lt;iterator&gt;?)。
  • 最近版本的 libstdc++ 和 libc++ 使用 sfinae 来约束 std::distance 的参数,所以不合适的参数意味着这个重载被忽略。旧版本的 Visual Studio 还没有这样做,并且有一个硬错误。
  • @MarcGlisse 谢谢,这听起来很合理。我根据您的反馈更新了我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多