从C ++移植到C ++ / CLI

时间:2016-10-18 09:15:45

标签: c++ c++-cli porting

我真的不相信以前从未问过这个问题,但我真的试图搜索没有成功,如果你有一个已经回答的类似问题的链接,请分享。

我正在将C ++ / Win32程序移植到C ++ / CLI,当然,我正在努力减少对代码的修改次数,以加快重新测试阶段。

由于全局函数将对象作为参数,我遇到了一些麻烦,这里有一个简短的例子:

类头文件

namespace MyNamespace {
    public ref class MyClass {
    public:
        void test();
    };
}

类cpp文件

using MyNamespace;

void myFunction(MyClass ^obj);

void MyClass::test() {
    myFunction(this);
}

问题就出现了:如果我从MyNamspace中省略myFunction,它就不能使用MyClass作为参数的类型。如果我在MyNamespace中包含myFunction,则每个cpp文件都将正确编译,但我会收到链接器错误“LNK2028 unresolved token”。

一个想法是定义一个新类并将myFunction包含为公共静态方法,但要做到这一点将是一项漫长的工作,因为真实项目中的myFunction并不孤单......还有其他想法吗?

2 个答案:

答案 0 :(得分:0)

如果MyClass位于MyNamespacemyFunction不在,则可以MyClass使用全名资格:

void myFunction(MyNamespace::MyClass ^obj);

当然,您的myFunction应该在某个地方实施。

答案 1 :(得分:0)

我根据Nikita的建议做了一些测试,最终的,有效的代码看起来像这样:

类头文件

namespace MyNamespace {
    public ref class MyClass {
    public:
        void test();
    };
}

类cpp文件

void myFunction(MyClass ^obj);

using MyNamespace;

void MyClass::test() {
    myFunction(this);
}

全局功能cpp文件

using namespace MyNamespace;

void myFunction(MyClass ^obj) {
    //do something
}

在全局函数的cpp文件中使用这种方法可以使用MyClass,而myFunction保持(或假装保持)全局,并且MyClass :: test可以访问myFunction,即使不在同一名称空间中,只需使用原型声明,如“旧”c ++。