2016-06-27 16 views
4

このコードがクラッシュし、なぜ誰も説明できますか? mingwとubuntuの両方のウィンドウで同じ動作があります。デバッガパーテンプレートクラスの静的変数の初期化

パラメータ「」ひとつのコンストラクタに渡されたが、「アウト最適化」されています。私は静的メンバtwo_にアクセスしようとすると、

クラッシュが起こります。私はあなたがここに持っているものと信じて

#ifndef THREE_H 
#define THREE_H 
#include <string> 

class One 
{ 
public: 
    One(const std::string& a) 
     : a_(a) 
    { 

    } 
    std::string a_; 
}; 

template<typename P> 
class Two : public One 
{ 
public: 
    Two() 
     : One(P::name) 
    { 

    } 
    std::string foo() 
    { 
     return a_; 
    } 
}; 

template<typename T> 
class Three 
{ 
public: 
    struct Info 
    { 
     static std::string name; 
    }; 
    typedef Two<Info> Two_t; 
    static Two_t two_; 
}; 

template < typename T > 
std::string Three<T>::Info::name = std::string("aaaa"); 

template < typename T > 
typename Three<T>::Two_t Three<T>::two_ = Three<T>::Two_t(); 


#endif // THREE_H 
+1

あなたの最後の行の 'テンプレート'に 'T'が足りないことは確かですか?私はそれが私の前部罰金コンパイルすることを修正した場合:http://ideone.com/w5RFB8 –

+1

は答えは最後に 'テンプレート' – WhozCraig

+0

に固定行方不明 'T'を想定する必要があり@JonathanMeeアプリがクラッシュします。 – orbitcowboy

答えて

2

three.h

static initialization order fiascoのインスタンスです。単純に、静的初期化子の順序に依存することはできません。あなたは、最初の使用に構文を使用することを検討すべきであるパターン(同じリンク、以下の一つの質問を参照してください)。だけで明示的に特化していない(静的/スレッドローカル)クラステンプレートデータメンバーに適用され

1)順不同動的初期を、:

en.cppreference.comが言うには、以下があります。そのような静的変数の初期化は、他のすべての動的初期化に関して不確定に順序付けられる。このようなスレッドローカル変数の初期化は、他のすべての動的初期化に関して順序付けされていません。

関連する問題