我真的不相信以前从未问过这个问题,但我真的试图搜索没有成功,如果你有一个已经回答的类似问题的链接,请分享。
我正在将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并不孤单......还有其他想法吗?
答案 0 :(得分:0)
如果MyClass
位于MyNamespace
而myFunction
不在,则可以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 ++。