C++ Statique de l'initialisation de membre (modèle de plaisir à l'intérieur)

Statique de l'initialisation de membre-je utiliser un imbriquée helper struct, qui fonctionne très bien pour les non basées sur des modèles de classes.
Cependant, si la classe englobante est paramétrée par un modèle, imbriquées l'initialisation de la classe n'est pas instancié, si l'objet d'assistance n'est pas accessible dans le code principal.
Pour illustration, un exemple simplifié (Dans mon cas, j'ai besoin d'initialiser un vecteur).

#include <string>
#include <iostream>

struct A
{
    struct InitHelper
    {
        InitHelper()
        {
            A::mA = "Hello, I'm A.";
        }
    };
    static std::string mA;
    static InitHelper mInit;

    static const std::string& getA(){ return mA; }
};
std::string A::mA;
A::InitHelper A::mInit;


template<class T>
struct B
{
    struct InitHelper
    {
        InitHelper()
        {
            B<T>::mB = "Hello, I'm B."; //[3]
        }
    };
    static std::string mB;
    static InitHelper mInit;

    static const std::string& getB() { return mB; }
    static InitHelper& getHelper(){ return mInit; }
};
template<class T>
std::string B<T>::mB; //[4]
template<class T>
typename B<T>::InitHelper B<T>::mInit;


int main(int argc, char* argv[])
{
    std::cout << "A = " << A::getA() << std::endl;

//   std::cout << "B = " << B<int>::getB() << std::endl; //[1]
//   B<int>::getHelper();    //[2]
}

Avec g++ 4.4.1:

  • [1] et [2], a commenté:

    A = Bonjour, je suis A.

    Fonctionne comme prévu

  • [1] sans commentaire:

    A = Bonjour, je suis A. 
    B = 

    Je l'espère, que le InitHelper initialise mo

  • [1] et [2] sans commentaire:
    A = Bonjour, je suis A. 
    B = Bonjour, je suis B.

    Il fonctionne comme prévu

  • [1], a commenté, [2] sans commentaire:

    Erreur dans l'initialisation statique stade [3]

Donc ma question: Est-ce un bug du compilateur ou est le bug assis entre le moniteur et le président?
Et si ce dernier est le cas: Est-il une solution élégante (c'est à dire sans appeler explicitement une initialisation statique méthode)?

I Mise À Jour:

Cela semble être un comportement souhaité (tel que défini dans la norme ISO/IEC C++ standard 2003, 14.7.1):

À moins qu'un membre d'un modèle de classe ou un membre de modèle a été instancié explicitement ou explicitement spécialisés, la spécialisation du membre est automatiquement instanciés lorsque la spécialisation est référencé dans un contexte qui exige la définition du membre d'exister; en particulier, l'initialisation (et de tous les effets indésirables liés) d'une donnée membre statique ne pas se produire à moins que la donnée membre statique est utilisée d'une manière qui exige la définition de la donnée membre statique d'exister.

  • Visual Studio 2008 a le même comportement (-erreur dans l'initialisation statique)
  • Pourquoi ne pas simplement écrire std::string B<T>::mo = "Bonjour, je suis B."?
  • Ok, je vois que dans le cas où vous avez besoin de inialize un vecteur, désolé.
  • Insérez mB définition dans InitHelper.
InformationsquelleAutor Mr. Mr. | 2009-11-30