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

Porting from C++ to C++/CLI

我真的不相信这个问题以前从未被问过,但我确实尝试过搜索但没有成功,如果您对已经回答过的类似问题有 link,请分享。

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

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

Class头文件

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

Class cpp 文件

using MyNamespace;

void myFunction(MyClass ^obj);

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

问题来了:如果我从 MyNamspace 中省略 myFunction,它就不能使用 MyClass 作为参数类型。如果我在 MyNamespace 中包含 myFunction,每个 cpp 文件都会正确编译,但我会得到一个 linker 错误 "LNK2028 unresolved token".

一个想法是定义一个新的 class 并将 myFunction 包含为一个 public 静态方法,但这样做将是一项漫长的工作,因为 myFunction 在实际项目中不是一个人...还有其他想法吗?

如果 MyClassMyNamespacemyFunction 不在,您可以使用 MyClass 全名限定:

void myFunction(MyNamespace::MyClass ^obj);

当然你的myFunction应该在某处实施。

我按照 Nikita 的建议进行了一些测试,最终的工作代码如下所示:

Class头文件

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

Class 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 即使不在同一个命名空间中, 仅使用 "old" c++.

中的原型声明