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