将'system :: string'传递给函数时出错

时间:2013-03-01 22:59:43

标签: c++ string c++-cli

我有以下功能,希望能告诉我文件夹是否存在,但是当我调用它时,我收到此错误 -

  

无法将参数1从'System :: String ^'转换为'std :: string'

功能 -

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

bool directory_exists(std::string path){

    struct stat fileinfo;

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

}

调用(来自form.h文件,其中包含用户选择文件夹的表单) -

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

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

    }

有人能告诉我如何拍这个吗?感谢。

3 个答案:

答案 0 :(得分:2)

您正尝试将托管的C ++ / CLI字符串(System::String^)转换为std::string。没有为此提供隐式转换。

为了实现这一点,您必须处理string conversion yourself

这可能看起来像:

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

话虽如此,在这种情况下,完全坚持托管API可能更容易:

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

答案 1 :(得分:1)

您正在尝试将CLR字符串转换为STL字符串,以将其转换为C字符串,以将其与POSIX仿真函数一起使用。为什么这么复杂?由于您仍在使用C ++ / CLI,因此只需使用System::IO::Directory::Exists

答案 2 :(得分:0)

要完成此项工作,您需要将托管类型System::String转换为本机类型std::string。这涉及一些编组并将导致2个单独的字符串实例。 MSDN有一个方便的表,用于所有不同类型的字符串编组

  

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

在这种特殊情况下,您可以执行以下操作

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