2008-10-29 6 views
2
void f(cli::array<PointF> ^points){ 
    PointF& a = points[0]; 
    // and so on... 
} 

Compile erreur à la ligne 2.C++/CLI de référence variable

.\ndPanel.cpp(52) : error C2440: 'initializing' : cannot convert from 'System::Drawing::PointF' to 'System::Drawing::PointF &' 
     An object from the gc heap (element of a managed array) cannot be converted to a native reference 

Quelle est la façon réussi à déclarer une variable de référence?

Répondre

3

Si vous voulez juste de déclarer une référence au premier PointF dans le tableau, vous devez utiliser un tracking reference (%):

void f(cli::array<PointF>^ points) 
{  
    PointF% a = points[0]; 
} 
1

Vous devez utiliser le modèle gcroot de fichier vcclr.h:

Ce sont des exemples de MSDN:

// mcpp_gcroot.cpp 
// compile with: /clr 
#include <vcclr.h> 
using namespace System; 

class CppClass { 
public: 
    gcroot<String^> str; // can use str as if it were String^ 
    CppClass() {} 
}; 

int main() { 
    CppClass c; 
    c.str = gcnew String("hello"); 
    Console::WriteLine(c.str); // no cast required 
} 

// mcpp_gcroot_2.cpp 
// compile with: /clr 
// compile with: /clr 
#include <vcclr.h> 
using namespace System; 

struct CppClass { 
    gcroot<String ^> * str; 
    CppClass() : str(new gcroot<String ^>) {} 

    ~CppClass() { delete str; } 

}; 

int main() { 
    CppClass c; 
    *c.str = gcnew String("hello"); 
    Console::WriteLine(*c.str); 
} 

// mcpp_gcroot_3.cpp 
// compile with: /clr 
#include <vcclr.h> 
using namespace System; 

public value struct V { 
    String^ str; 
}; 

class Native { 
public: 
    gcroot<V^> v_handle; 
}; 

int main() { 
    Native native; 
    V v; 
    native.v_handle = v; 
    native.v_handle->str = "Hello"; 
    Console::WriteLine("String in V: {0}", native.v_handle->str); 
} 

Vous trouverez plus here

+0

gcroot est juste un raccourci vers GCHandle et n'est pas une référence en soi. Il est utilisé pour permettre à une classe native de pointer vers et d'utiliser un objet géré en l'épinglant dans le tas géré. –

0

Et voici votre code modifié pour utiliser gcroot:

void f(cli::array<gcroot<PointF ^>> points){ 
    gcroot<PointF ^> a = points[0]; 
    // and so on... } 
Questions connexes