2012-04-08 56 views
2

我想用Clang编译一个C++库(用g ++编译得很好)。为什么clang会让STL混淆Boost?

但是,由于某种原因,我在使用stl容器时出现错误。错误消息似乎表明它认为我正在尝试使用增强设置,我不认为我是。

我不相信任何地方我以某种方式别名booststd,我从来没有真正使用using关键字。

/Users/zennatavares/repos/cliques/cliques/../cliques/structures/disjointset.h:140:8: error: too few template arguments for class template 'set' 
       std::set<int> visited_parents_; 
        ^
/usr/local/include/boost/detail/container_fwd.hpp:90:64: note: template is declared here 
    template <class Key, class Compare, class Allocator> class set; 
+3

这就是为什么我们不使用using语句将整个名称空间带入我们的代码。删除using语句并改为使用全名“std :: set”。 – 2012-04-08 21:32:44

+1

@MooingDuck:嗯,什么'使用'语句?他在他的代码中明确地将其定义为“std :: set”(或者至少是铿锵声重复的那一行)。 – 2012-04-08 21:38:08

+0

这就是说,一个[简短,自包含,正确(可编译),例子](http://sscce.org/)将不胜感激。你可能有一个'使用'声明在你不知道的地方。 – 2012-04-08 21:39:13

回答

6

我认为,问题是助推尝试转发申报空间std的成员,升压越来越向前声明错的libC++。没有任何可移植的方式来做这样的前置声明,所以提升真的不应该这样做。在命名空间std中声明结果会导致未定义的行为。

下面是针对这些问题之一提出的升级问题。 https://svn.boost.org/trac/boost/ticket/5197

如果您发布了一个完整的程序来重现问题,那么或许我们可以更详细地说明您可以在您的案例中解决这个问题。