2012-04-08 89 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

如果您發佈了一個完整的程序來重現問題,那麼或許我們可以更詳細地說明您可以在您的案例中解決這個問題。