2010-09-07 33 views
5

bao gồm "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 
    } 
}; 

Mã này khi biên soạn với VS2008 cho:marshal_as, dây và các lĩnh vực so với tính

.\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 ^)' 

Nhưng khi tôi thay đổi lĩnh vực này vào bất động sản:

property System::String^ text; 

thì mã này sẽ biên dịch mà không có lỗi. Tại sao?

Trả lời

5

Lỗi, được sửa trong VS2010. Mục phản hồi is here.

+2

Dường như không được sửa trong VS2010 (ít nhất, nó không hoạt động trong mã của tôi) nhưng giải pháp thay thế cho tôi. Cảm ơn! – Paul

+0

Không hoạt động trong mã của tôi, nhưng cách giải quyết này cũng cố định của tôi. Cảm ơn! – casper

+0

Thật vậy, chưa được khắc phục và xảy ra trong các tình huống khác như các phần tử mảng được quản lý marshaling: marshal_as (arrayOfSystemStrings [i]). Giải pháp thay thế là tạo một biến trung gian giả: System :: String^dummy = arrayOfSystemStrings [i]; std :: string s = marshal_as (giả); – Pragmateek

6

Một cách giải quyết là để tạo một bản sao như thế này:

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

Tôi vừa mới chạy với VS2013.3 - vẫn có vẻ là một vấn đề. Cách giải quyết bạn mô tả vẫn hoạt động. – Niall

1

Tôi đang sử dụng đoạn mã này rất nhiều, và nó quá nhiều lộn xộn để khai báo một biến mới. Tuy nhiên, quá trình này cũng hoạt động:

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

Một tùy chọn khác phù hợp với tôi là mẫu nhỏ này. Nó không chỉ giải quyết lỗi được thảo luận ở đây, nó còn sửa một thứ khác bị hỏng với marshal_as, cụ thể là nó không hoạt động đối với đầu vào nullptr. Nhưng thực sự là một bản dịch C++ tốt cho một hệ thống nullptr :: String sẽ là một .empty() std :: string(). Đây là mẫu:

template<typename ToType, typename FromType> 
inline ToType frum_cast(FromType s) 
{ 
    if (s == nullptr) 
     return ToType(); 
    return msclr::interop::marshal_as<ToType>(s); 
} 
Các vấn đề liên quan