2012-03-06 7 views
1

ブースト(1.49)、トランクのClang(& libC++)を使用するコードをコンパイルしようとしていました。 問題のコードは以下に要約:未定義テンプレートの暗黙のインスタンス化:Boost BugまたはClang Bug?

#include <memory> 
#include <boost/signals2.hpp> 

int main() 
{ 
    std::shared_ptr<int> s; 
} 

クランでコンパイルする場合、次のメッセージがemmitedれる:ブースト/信号S2 /ディテール/ foreign_ptr.hppで

$ clang++ -I/home/alexander/usr/local/include --stdlib=libc++ -std=c++0x signals2-bug.cpp -o signals2-bug 
signals2-bug.cpp:6:26: error: implicit instantiation of undefined template 
     'std::shared_ptr<int>' 
    std::shared_ptr<int> s; 
         ^
/home/alexander/usr/local/include/boost/signals2/detail/foreign_ptr.hpp:24:30: note: 
     template is declared here 
    template<typename T> class shared_ptr; 
         ^

問題の線です。

誰が責任を負うのですか?

2つのことが頭に浮かぶ:

  1. なぜBoost.Signalsヘッダが自身のshared_ptrを宣言する必要性を感じていますか?利益は何ですか?
  2. Boost.Signalsの行は、単純な前方宣言のように見えます。なぜそれがテンプレート定義の後に来るのか、それは問題になりますか?

EDIT

STDで物事の宣言ので、これは、Boost.Signals2のバグのように見える::未定義の動作で名前空間の結果を、ISO/IEC C++ 2011規格、セクションに応じて17.6.4.2.1:特に指定のない限り、それは名前空間stdまたは名前空間std 内の名前空間に宣言や 定義を追加する場合

C++プログラムの動作は未定義です。プログラムは、宣言がユーザ定義型 に依存し、かつその専門化が元のテンプレートの標準ライブラリ要件を満たし、明示的に が禁止されている場合にのみ、テンプレート 特殊化 を名前空間stdに追加できます。

チケットブーストバグトラッカーが作成されているに:https://svn.boost.org/trac/boost/ticket/6655

をクランのバグもここに存在していることに注意してください:http://llvm.org/bugs/show_bug.cgi?id=10521、違反にしかし、実装ポイント。 Googlerため

フォローアップ:

問題は確かにブーストのバグでした。このchangeset 77289はBoost 1.50の問題を修正するはずです。 対応するBug in Clangが無効とマークされました。

+3

私にはBoost.Signals2のかなりのバグのように見えます。 – ildjarn

+0

@ildjarn:テンプレートを宣言することに問題はありません。ただし、boostライブラリがそれらを定義しようとしていない限りです。エラーは定義がまったくないと思われます。明らかに、 ''は 'std :: shared_ptr'を期待通りに定義しませんでした。 –

+0

@Mike:確かに、Boostコードの '#if'は明らかに間違っています(少なくとも、理想的ではありません)。 – ildjarn

答えて

-1

foreign_ptr.hppのコードは(shared_ptrがすでに定義されている場合)再宣言で、そのような問題を(stdに宣言を追加することが技術的に未定義の動作ですが、そうではないので、ほとんどのコンパイラは気にしないが発生しない可能性が高いです標準のライブラリヘッダーと他のファイルを実際に区別します)。したがって、エラーはshared_ptrが実際には定義されていないことによってのみ発生する可能性があります。

libc++は明らかにshared_ptrの定義を持っているので、C++ 03ライブラリがインクルードパスに何とかしてlibC++より優先されていると疑うことができます。

+0

良いアイディアですが、インクルードパス(-vスイッチ付き)を確認しましたが、libC++のものの前に他のヘッダーはありません。 –

+0

私は重要なポイントは、それは未定義の動作だと思います!この規格は17.6.4.2.1に言及している。 Boost.Signals2に対するバグを説明し報告するために編集します。 –

+0

この回答は正しくありません。このエラーは、std内でネストされたインラインネームスペースのshared_ptrを宣言するlibC++と、ブーストコードの未定義の動作によって遠位に発生したために発生します。 –

関連する問題