C++ в Visual Studio 2010: невозможно присвоить строку строке (смешанные типы не поддерживаются)

Я пытаюсь сделать что-то очень простое... объявить строку в классе, а затем присвоить ей значение другой строки, определенной в конструкторе класса.

Я использую управляемую оболочку для неуправляемого класса "Неуправляемый" (использую управляемую оболочку, потому что хочу использовать ее в программе на C#, а то, что я использую, неуправляемое, и его файл .sln не находится под моим контролем)

Как видите, я попытался включить как можно больше строковых заголовков.

#pragma once
#include <string>
#include <string.h>
#include <cstring>
#include <iostream>
using namespace std;
using namespace System;
using std::string;

namespace UnmanagedWrap {

    public ref class Class1
    {
        // TODO: Add your methods for this class here.
    public:
        Unmanaged *pu; //pointer to the Unmanaged class
        //the constructor will allocate the pointer pu
        int a;
        int b;
        std::string filePath; //try CString() when get back
        Class1(int a_In, int b_In, std::string filePath_In) : pu(new Unmanaged()) { //constructor
            a = a_In;
            b = b_In;
            filePath = filePath_In; //trying to assign filePath to the inputted filePath_In.......
            }; //end of constructor

Это дает мне 2 ошибки:

Первый относится к строке std::string filePath;

1>c:\users\ngrace\documents\visual studio 2010\projects\unmanagedwrap\unmanagedwrap\UnmanagedWrap.h(21): error C4368: cannot define 'filePath' as a member of managed 'UnmanagedWrap::Class1': mixed types are not supported

Второй относится к строке filePath = filePath_In;

1>c:\users\ngrace\documents\visual studio 2010\projects\unmanagedwrap\unmanagedwrap\UnmanagedWrap.h(25): error C2678: binary '=' : no operator found which takes a left-hand operand of type 'std::string' (or there is no acceptable conversion)

Я очень растерялся, так как часами искал ответ...

Некоторые страницы, на которые я обратился за помощью:

Включение заголовков из неуправляемого кода C++ внутри C++/ CLI-код

Смешанные типы не поддерживаются

(Я бы опубликовал больше, но для этого мне нужна репутация не ниже 10....)

Любые идеи о том, почему я получаю эти ошибки?


person Nick    schedule 14.07.2016    source источник
comment
Смешанные типы не поддерживаются, кажется, говорит само за себя: std::string не является управляемым типом , поэтому его нельзя поместить в управляемую кучу.   -  person Bo Persson    schedule 14.07.2016
comment
Спасибо за ответ, это имело бы смысл. Знаете ли вы, есть ли в C++ управляемый тип для строковых переменных?   -  person Nick    schedule 14.07.2016


Ответы (2)


Используя информацию от Бо Перссона и пользователя 2666293, я решил попробовать что-то, что в итоге стало ответом на этот вопрос.

Вы должны использовать тип System::String^ для управляемых строк. Если вы используете управляемую строку и передаете ее методу в неуправляемом классе, она должна быть преобразована в тип неуправляемой строки!

Допустим, мы используем неуправляемый строковый тип std::string в классе unmanaged.

Преобразование из System::String^ в std:string должно выполняться с использованием:

 auto unmannedString = msclr::interop::marshal_as<std::string>(managedString);

и со ссылкой на файл заголовка в верхней части:

#include <msclr/marshal_cppstd.h>

где managedString имеет тип System::String^

:)

person Nick    schedule 14.07.2016
comment
Спасибо! Я перехожу из мира gcc в VC++ и должен сказать, что ненавижу его. В итоге я изменил свой класс std::string на System::String^, и теперь все работает. Ваш ответ должен быть помечен как решение. - person PfunnyGuy; 10.04.2017

https://msdn.microsoft.com/en-us/library/hh699870.aspx говорит в пункте 2, что классы ссылок могут иметь только стандартные типы C++, если они не являются общедоступными. Попробуйте использовать обычный класс или сделайте filePath закрытым.

edit: я не знаком с управляемыми классами, но вы можете попробовать Platform::string вместо std::string : https://msdn.microsoft.com/en-us/library/hh755812.aspx

https://msdn.microsoft.com/en-us/library/hh699879.aspx указывает использовать строки платформы, когда вы передаете строки туда и обратно методам в классах среды выполнения Windows или когда вы взаимодействуете с другими компонентами среды выполнения Windows.

person Samuel    schedule 14.07.2016
comment
Спасибо за ответ, обязательно присмотрюсь к ним! - person Nick; 14.07.2016