2010-09-07 10 views
5

incluyen "stdafx.h"

#include <string> 
#include <msclr/marshal_cppstd.h> 

ref class Test { 
    System::String^ text; 
    void Method() { 
     std::string f = msclr::interop::marshal_as<std::string>(text); // line 8 
    } 
}; 

Este código cuando se compila con VS2008 da:marshal_as, cuerdas y campos vs. propiedades

.\test.cpp(8) : error C2665: 'msclr::interop::marshal_as' : none of the 3 overloads could convert all the argument types 
     f:\programy\vs9\vc\include\msclr\marshal.h(153): could be '_To_Type msclr::interop::marshal_as<std::string>(const char [])' 
     with 
     [ 
      _To_Type=std::string 
     ] 
     f:\programy\vs9\vc\include\msclr\marshal.h(160): or  '_To_Type msclr::interop::marshal_as<std::string>(const wchar_t [])' 
     with 
     [ 
      _To_Type=std::string 
     ] 
     f:\Programy\VS9\VC\include\msclr/marshal_cppstd.h(35): or  'std::string msclr::interop::marshal_as<std::string,System::String^>(System::String ^const &)' 
     while trying to match the argument list '(System::String ^)' 

Pero cuando cambio el campo en propiedad:

property System::String^ text; 

luego este código se compila sin errores. ¿Por qué?

Respuesta

5

Error solucionado en VS2010. Comentarios artículo is here.

+2

Parece no ser corregido en VS2010 (al menos, no funcionó en mi código) pero la solución funcionó para mí. ¡Gracias! – Paul

+0

Tampoco funcionaba en mi código, pero esta solución también solucionó la mía. ¡Gracias! – casper

+0

De hecho, aún no se ha corregido, y ocurre en otras situaciones, como la ordenación de elementos de matrices administradas: marshal_as (arrayOfSystemStrings [i]). La solución consiste en crear una variable intermedia ficticia: System :: String^dummy = arrayOfSystemStrings [i]; std :: string s = marshal_as (dummy); – Pragmateek

6

Una solución es hacer una copia de esta manera:

ref class Test { 
    System::String^ text; 
    void Method() { 
     System::String^ workaround = text; 
     std::string f = msclr::interop::marshal_as<std::string>(workaround); 
    } 
}; 
+2

Me acabo de topar con esto con VS2013.3 - todavía parece ser un problema. La solución que describes todavía funciona. – Niall

1

estoy usando este fragmento mucho, y es demasiado desorden de declarar una nueva variable. Sin embargo, esto también funciona:

msclr::interop::marshal_as<std::string>(gcnew String(string_to_be_converted)) 

Otra opción que me funciona es esta pequeña plantilla. No solo resuelve el error que se discute aquí, sino que también soluciona otra cosa que se rompe con marshal_as, es decir, que no funciona para la entrada de nullptr. Pero en realidad una buena traducción de C++ para un nullptr System :: String sería un .empty() std :: string(). Aquí está la plantilla:

template<typename ToType, typename FromType> 
inline ToType frum_cast(FromType s) 
{ 
    if (s == nullptr) 
     return ToType(); 
    return msclr::interop::marshal_as<ToType>(s); 
} 
Cuestiones relacionadas