使用从WinRT网格类派生的抽象类时出现CastToBase无法解析的外部符号错误?

这是我发现使用C++/CX时非常奇怪的事情。

如下所示:

ref class Duper : public Windows::UI::Xaml::Controls::Grid{
internal:
    Duper(){}
    virtual void doNothing() = 0;
public:
    virtual ~Duper(){}

};

ref class Sub : public Duper
{
internal:
    Sub(){}
    void doNothing()override{}
public:
    virtual ~Sub(){}
};

调用子类:

Sub^ test = ref new Sub();
test->doNothing();

运行正常,但在运行以下代码时:

Sub^ test = ref new Sub();
test->Width = 20;

您将看到类似于下面的错误

Error   226 error LNK2001: unresolved external symbol "public: class Windows::UI::Xaml::Controls::Grid ^ __stdcall XSideView::__abi_CastToBase(void)" (?__abi_CastToBase@XSideView@@Q$AAGP$AAVGrid@Controls@Xaml@UI@Windows@@XZ)    D:\OZSOURCE70\OZReportViewer\OZWRTViewer\ozrv\platform.lib(OZCViewerSideView.obj)   ozrv_dll

但是,您可以通过执行以下操作来避免调用CastToBase:

Grid^ base = dynamic_cast<Grid^>(test3);
base->Width = 30;

而且它会工作得很好。

有没有人能给我解释一下为什么会这样?除了每次使用Grid类时显式转换为Grid类之外,还有什么方法可以解决这个问题吗?虽然我没有费心去测试其他的ref类,但我打赌它们也会有类似的问题。

PS:这可能是一个bug,并在以后的版本中得到了修复(我目前正在使用VS2013在Windows8.1中开发)

PPS: CastToBase文档:https://docs.microsoft.com/en-us/cpp/windows/interfacetraits-casttobase-method

转载请注明出处:http://www.hhy777.com/article/20230526/2500245.html