我使用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;
}
以:
开头生成一个长模板barferror 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,但实用程序会受到影响。
答案 0 :(得分:1)
std::distance
函数计算两个迭代器之间的距离。
尝试删除using namespace std
或正确限定提升distance
功能。
问题仍然存在,为什么gcc和clang没有抱怨?
正如@MarcGlisse所指出的,原因可能归结为C ++库实现所采用的复杂程度:
libstdc ++和libc ++的最新版本使用sfinae
旧版本的Visual Studio尚未执行此操作
这是一个非常合理的解释,为什么它适用于某些编译器而不适用于其他编译器,因为SFINAE是一种从编译器将考虑的可能函数集中删除函数的机制。有关SFINAE(cppreference.com和WIKIPEDIA)
的详细信息