boost :: geometry和std命名空间与Visual Studio 2013冲突[重复]

问题描述 投票:2回答:1

这个问题在这里已有答案:

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

c++ visual-studio boost namespaces boost-geometry
1个回答
1
投票

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

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

编辑

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.