我在不同的命名空间中有两个具有相同名称的类。我无法修改类的名称。 我想在其中一个类中添加一个方法,但我不允许将其添加为公共方法。另一个类用C ++ / CLI编写为ref类,需要访问此方法。 我尝试使用朋友课,但我不知道应该如何使用它。
标准c ++中的dll:
namespace X
{
class A
{
protected:
__declspec(dllexport) void method();
}
}
在C ++ / CLI中的应用程序
namespace Y
{
ref class A
{
void someMethod()
{
X::A otherClass;
otherClass.method();
}
}
}
我尝试过以下方法: 朋友班Y :: A; //编译器错误C2653:Y不是类或命名空间名称
当我声明命名空间Y时,我得到错误C2039:'A':不是'Y'的成员
我无法在命名空间Y中添加类A的前向声明,因为类A是使用标准C ++编译的,并且在前向声明中我必须将其声明为ref类。
编译器:Visual Studio 2008
有人有想法吗?
谢谢
解决方案(感谢Sorayuki):
#ifdef __cplusplus_cli
#define CLI_REF_CLASS ref class
#else
#define CLI_REF_CLASS class
#endif
namespace Y { CLI_REF_CLASS A; }
namespace X
{
class A
{
protected:
friend CLI_REF_CLASS Y::A;
__declspec(dllexport) void method();
}
}
答案 0 :(得分:1)
我不确定是否允许这种技巧。
但也许你想看看这种“黑客”:
在c ++ / cli
中namespace Y
{
class HackA : public X::A {
public:
void CallMethod() { method(); }
};
ref class A
{
void someMethod()
{
X::A otherClass;
assert(sizeof(HackA) == (X::A));
HackA* p = (HackA*) &otherClass;
p->CallMethod();
}
};
};
修改强>
我已经测试过这可以通过编译
namespace Y { ref class A; };
namespace X
{
class A
{
friend ref class Y::A;
protected:
__declspec(dllexport) void method();
};
};
namespace Y
{
ref class A
{
void someMethod()
{
X::A otherClass;
otherClass.method();
}
};
};
也许你只需要复制X :: A的头文件并通过在命名空间X之前添加一个声明(不是定义)Y :: A来编辑副本,而是包含“copy”。