boost :: geometry和std命名空间与Visual Studio 2013冲突

时间:2015-04-18 03:57:33

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

我使用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,但实用程序会受到影响。

1 个答案:

答案 0 :(得分:1)

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

尝试删除using namespace std或正确限定提升distance功能。

修改

  

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

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

  

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

     

旧版本的Visual Studio尚未执行此操作

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

的详细信息