2017-05-21 7 views
2

私は私の頭を包むことができないこの奇妙なバグを持っています。私はそれを単純な例に減らしました。私は空のデストラクタを作成することでそれを修正できますが、何が起こっているのか本当に知りたいです。関数がテンプレート化されているときにリンカーエラーがデストラクタを見つけられない

#include <cstdio> 
#include <functional> 

struct test { 
    inline test() 
    {} 

    const std::function<void()> f; 
    const int universe = 42; 
}; 

template<size_t n = 1> 
inline void do_test(const test& t = {}) { 
    printf("%d\n", t.universe); 
} 

int main(int, char**) { 
// test t; 
    do_test(); 
    return 0; 
} 

これはエラーを出力し、コンパイルされません。

clang++ -O3 -std=c++1z -stdlib=libc++ -Wall main.cpp 
Undefined symbols for architecture x86_64: 
    "test::~test()", referenced from: 
     _main in main-df96d9.o 
ld: symbol(s) not found for architecture x86_64 

あなたはどちらか、私はtest t;オブジェクトを作成する行のコメントを解除、またはdo_test()からテンプレートパラメータを削除した場合、それがコンパイルされます。例では、単純化され

注、実際のソフトウェア等

それはデストラクタを見つけることについて不平を言っている理由を任意のアイデアカスタムコンストラクタ、テンプレートパラメータが必要ですか?

+0

[こちらの証明書](http://coliru.stacked-crooked.com/a/bbf534d106b15cf2) –

+1

クラングバグのようです。 GCCはこのコードに問題はありません。 –

+0

VS2015でコンパイルされていますが、ここで大丈夫です。それはそれからclang特有でなければなりません。 "{}"ではなく "test()"を使用して "const test"を初期化して、初期化リストに関連する特定のバグかどうか確認してください。おそらく起こっているのは、コンパイラが、クラスの参照を参照したときにクラスのデフォルトのデストラクタを作成する必要があることに気付かず、初期化子のリスト=>コンストラクタの自動変換は、クラスの詳細を解決しました。 –

答えて

0

clangの確認済みバグ< 4そうです。

関連する問題