2014-05-24 3 views
1
ref class A 
{ 
public: 
    cliext::vector<int> x; 

    A(void); 
    A(const A^ copied): 
     x(copied->x){}; 
}; 

Je:cliext :: vecteur et copier constructeur

classe "cliext :: vector < _Value_t>": aucun constructeur de copie disponible ou constructeur de copie est déclarée 'explicite'

Comment créer une copie vectorielle?

+0

Essayez 'copié-> x.Clone()'? –

+0

cliext :: impl :: vector_impl <_Value_t, _Is_ref> :: Clone: ​​les surcharges numériques n'ont aucune conversion légale pour 'this' – Novikoff

+0

Eh bien ... cherchez la définition de l'interface 'IClonable' pour savoir comment cloner des choses. Je suis juste en train de deviner. –

Répondre

1

Comme indiqué dans le commentaire, les types de référence gérés doivent être déclarés avec le symbole^hat. Et ils doivent être initialisés, ce qui nécessite d'utiliser gcnew pour allouer de la mémoire GC pour l'objet. Il est donc:

ref class A { 
public: 
    cliext::vector<int>^ x; 

    A() : x(gcnew cliext::vector<int>) {} 
    // etc.. 
}; 

Prenez note que si vous fournissez un constructeur de copie alors vous devez fournir à l'opérateur d'affectation ainsi, le style règle de trois. Ceci est rarement nécessaire pour les types de référence à moins que vous leur donniez une sémantique de valeur comme les besoins STL/CLR. Sinon, la raison pour laquelle perf is so poor. Favoriser fortement List<T> à la place. Un gros avantage d'avoir un garbage collector est que vous n'avez plus à vous soucier des objets d'une collection qui ont besoin d'être détruits.

Questions connexes