David Gard
David Gard

Reputation: 12047

Error when passing a 'system::string' to a function

I have the following function, which will hopefully tell me whether or not a folder exists, but when I call it, I get this error -

cannot convert parameter 1 from 'System::String ^' to 'std::string'

The function -

#include <sys/stat.h>
#include <string>

bool directory_exists(std::string path){

    struct stat fileinfo;

    return !stat(path.c_str(), &fileinfo);

}

The call (from the form.h file that holds the form where the user selects the folder) -

private:
    System::Void radioListFiles_CheckedChanged(System::Object^  sender, System::EventArgs^  e) {

        if(directory_exists(txtActionFolder->Text)){                
            this->btnFinish->Enabled = true;
        }

    }

Is anyone able to tell me how to filx this? Thanks.

Upvotes: 1

Views: 298

Answers (3)

Matteo Italia
Matteo Italia

Reputation: 126857

You are trying to convert a CLR string to a STL string to convert it to a C-string to use it with a POSIX-emulation function. Why such a complication? Since you are using C++/CLI anyway, just use System::IO::Directory::Exists.

Upvotes: 1

JaredPar
JaredPar

Reputation: 755041

To make this work you need to convert from the managed type System::String to the native type std::string. This involves a bit of marshaling and will result in 2 separate string instances. MSDN has a handy table for all of the different types of marshaling for strings

http://msdn.microsoft.com/en-us/library/bb384865.aspx

In this particular case you can do the following

std::string nativeStr = msclr::interop::marshal_as<std::string>(managedStr);

Upvotes: 0

Reed Copsey
Reed Copsey

Reputation: 564551

You're trying to convert from a managed, C++/CLI string (System::String^) into a std::string. There is no implicit conversion provided for this.

In order for this to work, you'll have to handle the string conversion yourself.

This will likely look something like:

std::string path = context->marshal_as<std::string>(txtActionFolder->Text));
if(directory_exists(path)) {  
     this->btnFinish->Enabled = true;
}

That being said, in this case, it might be easier to stick to managed APIs entirely:

if(System::IO::Directory::Exists(txtActionFolder->Text)) {  
     this->btnFinish->Enabled = true;
}

Upvotes: 2

Related Questions