将旧的托管 C++ 项目转换为新的 C++/CLI
converting old Managed-C++ Project to new C++/CLI
我有一个用 oldSyntax 编写的旧项目。它在 VS2012 中工作得很好,但我看到在 VS2015 中 /clr:oldSyntax 不再可用,正如我所期望的那样,我遇到了很多错误。
我设法摆脱了其中的一些,但现在我被这些代码行阻止了:
ref class myColumnItemSorterClass : public IComparer
{
int IComparer::Compare(Object^ x, Object^ y)
{
if (x && y) {
ColumnItemType^ pSSx = dynamic_cast<ColumnItemType^>(x);
ColumnItemType^ pSSy = dynamic_cast<ColumnItemType^>(y);
if (pSSx->Position&&pSSx->Position->Length>0 &&
pSSy->Position&&pSSy->Position->Length>0) {
int xPos = Convert::ToInt32(pSSx->Position);
int yPos = Convert::ToInt32(pSSy->Position);
if (xPos < yPos) {
return -1;
} else if (xPos > yPos) {
return 1;
} else {
return 0;
}
} else {
return 0;
}
} else {
return 0;
}
}
};
有 2 个错误:
at myColumnItemSorterClass -> Class 未能实现接口成员函数 "System::Collections::IComparer::Compare"(在“C:...\NETFramework\v4 中声明)。 0\mscorlib.dll)
在比较 -> 不允许使用限定名称
知道如何修复它们吗?
覆盖的接口方法必须是virtual
和public
,并且可以是sealed
以防止派生 class 重新实现该方法。
不要用接口名称限定方法(例如:IComparer::Compare
)。编译器会将此解释为定义显式覆盖的尝试失败(请参阅编译器错误 C3253)。
ref class myColumnItemSorterClass : IComparer
{
public:
virtual int Compare(Object^ x, Object^ y)
{
/*...*/
return 0;
}
};
如果您希望重写的方法只能通过接口句柄访问,可以使用explicit overriding。覆盖的方法必须仍然是virtual
,但是可以是private
并且应该[=32] =] 是 sealed
.
ref class myColumnItemSorterClass : IComparer
{
private:
virtual int CompareExplicit(Object^ x, Object^ y) sealed = IComparer::Compare
{
/*...*/
return 0;
}
};
我有一个用 oldSyntax 编写的旧项目。它在 VS2012 中工作得很好,但我看到在 VS2015 中 /clr:oldSyntax 不再可用,正如我所期望的那样,我遇到了很多错误。 我设法摆脱了其中的一些,但现在我被这些代码行阻止了:
ref class myColumnItemSorterClass : public IComparer
{
int IComparer::Compare(Object^ x, Object^ y)
{
if (x && y) {
ColumnItemType^ pSSx = dynamic_cast<ColumnItemType^>(x);
ColumnItemType^ pSSy = dynamic_cast<ColumnItemType^>(y);
if (pSSx->Position&&pSSx->Position->Length>0 &&
pSSy->Position&&pSSy->Position->Length>0) {
int xPos = Convert::ToInt32(pSSx->Position);
int yPos = Convert::ToInt32(pSSy->Position);
if (xPos < yPos) {
return -1;
} else if (xPos > yPos) {
return 1;
} else {
return 0;
}
} else {
return 0;
}
} else {
return 0;
}
}
};
有 2 个错误:
at myColumnItemSorterClass -> Class 未能实现接口成员函数 "System::Collections::IComparer::Compare"(在“C:...\NETFramework\v4 中声明)。 0\mscorlib.dll)
在比较 -> 不允许使用限定名称
知道如何修复它们吗?
覆盖的接口方法必须是virtual
和public
,并且可以是sealed
以防止派生 class 重新实现该方法。
不要用接口名称限定方法(例如:IComparer::Compare
)。编译器会将此解释为定义显式覆盖的尝试失败(请参阅编译器错误 C3253)。
ref class myColumnItemSorterClass : IComparer
{
public:
virtual int Compare(Object^ x, Object^ y)
{
/*...*/
return 0;
}
};
如果您希望重写的方法只能通过接口句柄访问,可以使用explicit overriding。覆盖的方法必须仍然是virtual
,但是可以是private
并且应该[=32] =] 是 sealed
.
ref class myColumnItemSorterClass : IComparer
{
private:
virtual int CompareExplicit(Object^ x, Object^ y) sealed = IComparer::Compare
{
/*...*/
return 0;
}
};