En C, les membres statiques peuvent être initialisés à l'aide de structures d'assistance imbriquées. Bien que cette approche fonctionne bien pour les classes sans modèle, elle peut poser des problèmes dans les classes avec des paramètres de modèle.
Considérez l'exemple suivant, où un assistant d'initialisation de membre statique est utilisé dans un classe basée sur un modèle :
<code class="cpp">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; } }; template<class T> struct B { struct InitHelper { InitHelper() { B<T>::mB = "Hello, I'm B."; } // [3] }; static std::string mB; static InitHelper mInit; // [4] static const std::string& getB() { return mB; } static InitHelper& getHelper() { return mInit; } };</code>
Dans ce scénario, les observations suivantes sont faites :
Le comportement inattendu provient du comportement de l'initialisation des membres statiques dans classes modélisées. Selon la norme ISO/IEC C 2003 (14.7.1), l'initialisation d'une donnée membre statique se produit uniquement si la donnée membre statique est elle-même utilisée d'une manière qui nécessite que sa définition existe.
Pour Pour éviter de recourir à une initialisation implicite et garantir un ordre d'initialisation cohérent, il est recommandé de spécialiser explicitement les données membres statiques dans le modèle de classe. Dans ce cas :
<code class="cpp">template<> std::string B<int>::mB = "Hello, I'm B (int specialization).";</code>
En spécialisant explicitement le membre de données statique pour chaque instanciation de la classe basée sur un modèle, l'initialisation est explicitement déclenchée et le comportement souhaité est obtenu sans avoir à recourir à l'assistant d'initialisation.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!