奇怪的C3767候选函数无法访问错误消息

时间:2011-05-26 19:46:11

标签: .net c++-cli

有人可以解释为什么我在编译下面显示的代码时会遇到以下错误(以及如何修复它)

  

错误C3767:'ManagedClass::SetString':候选函数无法访问e:\ Temp \ ManagedCpp \ ManagedCpp \ ManagedCpp.cpp 24 ManagedCpp

     

错误C3767:'ManagedClass::GetString':候选函数无法访问e:\ Temp \ ManagedCpp \ ManagedCpp \ ManagedCpp.cpp 26 ManagedCpp

我读了以下类似的问题, C++ CLI error C3767: candidate function(s) not accessible 哪个州

  

我建议您在所有公共API中使用托管类型System::String^。这也确保您的库可以从其他CLR语言(如c#

)轻松调用

这正是我所做的(BTW这是用于在更大的混合模式dll中提取相同编译错误的测试代码)。

(该项目是VS2008 C ++ / CLI项目,即从菜单中选择文件 - >新项目 - > Visual C ++ - > CLR控制台应用程序。)

感谢您的帮助。

using namespace System;

static public ref class ManagedClass
{
    static public int SetString(String^ s)
    {
        str = s;
    }

    static public String^ GetString()
    {
        return str;
    }

    static String^ str ;
};

int main(array<System::String ^> ^args)
{
    String^ test ="Here";
    ManagedClass::SetString(test);
    String^ j=  ManagedClass::GetString();
    return 0;
}

1 个答案:

答案 0 :(得分:3)

你正在使用C#-ish语法;正确的C ++ / CLI语法是:

public ref class ManagedClass abstract sealed
{
public:
    static void SetString(String^ s) { str = s; }
    static String^ GetString() { return str; }

private: // I assume you want this even though your code omitted it
    static String^ str;
};

请注意,.NET代码使用属性而不是get / set成员函数对会更加惯用。