2010-04-29 5 views
2

Je crois comprendre qu'une déclaration ou une typedef d'une spécialisation devrait provoquer l'instanciation d'une classe template, mais cela ne semble pas se produire avec gcc. Par exemple. J'ai une classe de modèle, classe de modèle Foo {};Problème gcc avec instanciation de modèle explicite?

J'écris

class Foo<double>; 

ou

typedef Foo<double> DoubleFoo; 

mais après la compilation de la table des symboles du fichier objet résultant ne contient pas les membres de Foo.

Si je crée un exemple:

Foo<double> aFoo; 

alors des symboles sont bien sûr tous générés.

Est-ce que quelqu'un d'autre a vécu cela et/ou a-t-il une explication?

Répondre

6

La syntaxe de instanciation explicite est

template class Foo<double>; 

Voir C++ 03 §14.7.2.

Espérer que les fonctions sont générées et liées, mais non supprimées après avoir créé, mais n'utilisant pas, une instance (l'instanciation implicite la plus minime), est tout à fait un pari.

+1

Je pense que Potatoswatter est sur quelque chose ici. Je n'ai jamais entendu parler d'une telle utilisation pour typedef. C'est seulement pour les types shorthanding, et n'instancie jamais rien. – daramarak

+0

Oui, vous avez raison, je ne suis pas sûr d'où j'ai ramassé cette désinformation à propos de typedefs. J'étais sur la bonne voie avec la déclaration, mais j'ai laissé de côté le mot clé «template». Merci –

0

Vous parlez de instanciation implicite. Mais cela n'arrive que si les complétions du type de classe affectent la sémantique du programme.

Dans votre cas, le type de classe n'a pas besoin d'être complet car le type que vous typedef peut rester incomplet (le corps de la classe n'est pas nécessaire, il n'est donc pas nécessaire de l'instancier). Pour illustrer, vous pouvez également dire typedef class MyFunnyThing type; dans une déclaration de son propre chef, sans jamais définir cette classe n'importe où.

Si vous créez un objet, son type doit être complet, et le modèle de classe est alors implicitement instancié. Notez que l'instanciation implicite d'un modèle de classe n'instancera pas implicitement la fonction membre ou les définitions de datamember statiques, sauf si elles sont explicitement utilisées ailleurs.

En outre, de déclarer une spécialisation d'un modèle de classe, le point entier est de prévenir une instanciation se passer, pour dire au compilateur « ne pas instancier, parce que je me spécialise plus tard explicitement ». La déclaration si votre spécialisation manque également un template<> en face d'elle.

Questions connexes