ブースト(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つのことが頭に浮かぶ:
- なぜBoost.Signalsヘッダが自身のshared_ptrを宣言する必要性を感じていますか?利益は何ですか?
- 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が無効とマークされました。
私にはBoost.Signals2のかなりのバグのように見えます。 – ildjarn
@ildjarn:テンプレートを宣言することに問題はありません。ただし、boostライブラリがそれらを定義しようとしていない限りです。エラーは定義がまったくないと思われます。明らかに、 ''は 'std :: shared_ptr'を期待通りに定義しませんでした。 –
@Mike:確かに、Boostコードの '#if'は明らかに間違っています(少なくとも、理想的ではありません)。 – ildjarn