.net 奇怪的C3767候选函数不可访问错误消息

.net 奇怪的C3767候选函数不可访问错误消息,.net,c++-cli,.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 我读到了以下类似的问题

有人能解释为什么我在编译下面显示的代码时会出现以下错误,以及如何修复它吗

错误C3767:“ManagedClass::SetString”:候选函数不可访问e:\Temp\ManagedCpp\ManagedCpp\ManagedCpp.cpp 24 ManagedCpp

错误C3767:“ManagedClass::GetString”:候选函数不可访问e:\Temp\ManagedCpp\ManagedCpp\ManagedCpp.cpp 26 ManagedCpp

我读到了以下类似的问题, 哪个州

我建议在所有公共API中改用托管类型System::String^。这也确保了您的库可以很容易地从其他CLR语言(如c)调用

这正是我所做的,顺便说一句,这是一个测试代码,用于在更大的混合模式dll中提取相同的编译错误

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

谢谢你的帮助


您使用的是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成员函数对更为惯用。

它有助于自上而下修复错误消息。早期的消息公共在静态之后所做的事情,它不能到达那里通常会导致后面的消息我试图调用的函数是私有的。
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;
};