【发布时间】: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 << "Distance p1-p2 is: " << distance(p1, p2) << endl是带有错误消息的行。 -
@PaulJurczak 标记为重复的帖子不会被删除,它们会被保留以便更容易在其他帖子中找到答案。 stackoverflow.com/help/duplicates
-
这不是VS中的缺陷,只是在C++14(或更高版本,我不记得了)中这样指定。乘以
using namespace仍然是个坏主意。
标签: c++ visual-studio boost namespaces boost-geometry