2016-06-27 2 views
4

Может ли кто-нибудь объяснить, почему этот код сбой? Такое же поведение наблюдается и в обоих окнах с mingw и ubuntu.статическая инициализация переменных в классе шаблонов

В отладчике параметр «a» передается конструктору. Один «оптимизирован».

Авария происходит, когда я пытаюсь получить доступ к статическому члену two_;

three.h

#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

Если ответы предполагают фиксированный недостающий 'T' в последнем' template ' – WhozCraig

+0

@JonathanMee приложение терпит крах. – orbitcowboy

ответ

2

Я считаю, что у вас здесь есть экземпляр static initialization order fiasco. Проще говоря, вы не можете зависеть от порядка статических инициализаторов. Вы должны рассмотреть возможность использования конструкции при первом использовании шаблона (см. Ту же ссылку, на один вопрос ниже).

en.cppreference.com имеет сказать следующее:

1) маркированной динамической инициализации, который применяется только к (статическим/локальному потоку) членам шаблона класса данных, которые явно не специализированы. Инициализация таких статических переменных неопределенно упорядочена по отношению ко всей другой динамической инициализации. Инициализация таких потоков-локальных переменных не влияет на всю другую динамическую инициализацию.

Смежные вопросы