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

时间:2013-04-24 08:39:21

标签: c++ class namespaces c++-cli friend

我在不同的命名空间中有两个具有相同名称的类。我无法修改类的名称。 我想在其中一个类中添加一个方法,但我不允许将其添加为公共方法。另一个类用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();
    }
}

1 个答案:

答案 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”。