gpt4 book ai didi

在不同命名空间中具有相同名称的 C++ 友元类

转载 作者:行者123 更新时间:2023-11-28 07:39:06 37 4
gpt4 key购买 nike

我在不同的命名空间中有两个同名的类。我无法修改类的名称。我想向其中一个类添加一个方法,但我不允许将其添加为公共(public)方法。另一个类作为 ref 类用 C++/CLI 编写,需要访问此方法。我尝试使用 friend 类,但我不知道应该如何使用它。

标准 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();
}
}
}

我试过以下方法: friend 类 Y::A;//编译器错误 C2653:Y 不是类或命名空间名称

当我声明命名空间 Y 时出现错误 C2039: 'A' : is not member of '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();
}
}

最佳答案

我不确定这种技巧是否被允许。

但也许你想看看这种“黑客攻击”:

在 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 来编辑拷贝,并改为包含“拷贝”。

关于在不同命名空间中具有相同名称的 C++ 友元类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16187308/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com