2010-04-16 4 views
2

J'ai une classe parente qui est modélisée et une classe enfant qui l'implémente.C2664 lors de la conversion d'une classe enfant en classe parent modèle

template< typename T1, typename T2>
class ParentClass{ . . . };

class ChildClass : public ParentClass<MyT1, MyT2> { . . . };

Et je veux avoir un pointeur que je peux utiliser polymorphically:

ParentClass<T1, T2>* ptr;
ptr = static_cast<ParentClass<MyT1, MyT2>* >(new ChildClass());

Peu importe la façon dont je l'ai jeté, je reçois un C2664 toujours qui a la même expression:

erreur C2664: impossible de convertir le paramètre 1 De 'ParentClass < T1, T2> *' à 'ParentClass < T1, T2> *'

Est-il impossible de lancer des types de pointeurs entre types hérités si le parent est basé sur un modèle, même si les types spécifiés dans les modèles sont le même?

+0

'MyT1' est-il différent de' T1'? Le 'static_cast' comme écrit est incohérent. – Potatoswatter

+0

Quel compilateur utilisez-vous? VC++? – outis

+0

Pourquoi avez-vous d'abord 'T1' et' MyT1'? Le premier devrait-il être 'MyT1'? –

Répondre

1

Il n'y a pas besoin d'un cast statique. Considérez ce code, qui fonctionne comme prévu:

template <typename T> 
struct base 
{ virtual ~base(){} }; 

struct child : base<int> 
{}; 

int main(void) 
{ 
    base<int>* b = new child; 
    // could be = static_cast<base<int>*>(new child);, but useless 

    delete b; 
} 

Êtes-vous sûr que les paramètres du modèle de base sont les mêmes?

5

C2664 se plaint de l'affectation, pas de la distribution (vous obtiendriez l'erreur C2440, "'static_cast': impossible de convertir depuis ...", si la distribution n'était pas valide).

Le problème est que les éléments suivants ne sont pas les mêmes:

ParentClass<T1, T2>* 
ParentClass<MyT1, MyT2>* 

instanciations de modèles avec différents paramètres sont différents, les types non apparentés.

Cela devrait bien:

ParentClass<MyT1, MyT2>* ptr; 
ptr = static_cast<ParentClass<MyT1, MyT2>* >(new ChildClass()); 

Bien qu'il soit tout à fait inutile de jeter dans ce cas, puisque dérivé pointeur à des conversions pointeur vers base sont implicites, donc ce qui suit est tout ce que vous avez besoin :

ptr = new ChildClass(); 
+0

Les instanciations de modèles sont en fait les mêmes, j'ai juste mélangé les deux dans l'exemple de code simple que j'ai tapé ci-dessus. T1 et T2 sont les noms de types de la déclaration de classe, MyT1 et MyT2 sont des types réels.Vous avez raison, ce devrait être: 'ParentClass * ptr; ptr = static_cast *> (new ChildClass()); ' J'ai essayé l'affectation simple (casting implicite), le typecasting et le casting statique en tant qu'expériences. –

+1

@DC: Vous devrez éditer votre question avec le code _exact_ que vous essayez de compiler. –

Questions connexes