为什么变量声明会引发异常?

时间:2019-01-31 15:53:44

标签: c++-winrt

翻译单元声明为全局变量的声明抛出异常。

Visual Studio 2017社区15.9.5版,已安装C ++ / WinRT扩展。项目是从“空白应用程序(C ++ / WinRT)模板”开始的。

我希望变量数组SolidColorBrush myBrushes[2];仅在单个转换单元中全局使用。它在翻译单元的名称空间中声明。

我尝试完全限定类型,将类型标记为static,然后尝试不使用数组名称。

#include "pch.h"
#include "MainPage.h"
//#include <winrt/Windows.UI.Xaml.Media.h>

using namespace winrt;
using namespace Windows::UI::Xaml;
using namespace Windows::UI::Xaml::Input;
using namespace Windows::UI::Xaml::Media;


//*************************************************************************************************
namespace winrt::event_Experiment::implementation
{

    //*************************************************************************************************
    //Windows::UI::Xaml::Media::SolidColorBrush myBrushes[2];
    //static SolidColorBrush myBrushes[2];
    SolidColorBrush myBrushes[2];

    //*************************************************************************************************
    MainPage::MainPage()
    {
        InitializeComponent();

        //myBrush.Color(Windows::UI::Colors::Blue());
        //myBrush[1].Color(Windows::UI::Colors::Red());

        //myStackPanel().Background() = myBrush;

        //SolidColorBrush tempBrush = SolidColorBrush(winrt::Windows::UI::Colors::Blue());
        //myBrush(tempBrush);

        myButton2().Click({ this, &MainPage::ClickHandler2 });
        myStackPanel().PointerPressed({ this, &MainPage::spPointerPressed });

        //myBrushes[0].Color(Windows::UI::Colors::Blue());
        //myBrushes[1].Color(Windows::UI::Colors::Red());

    }

引发的异常如下图所示。 enter image description here

Microsoft在2018年5月发布的C ++ / WinRT更新声明中声称,它是直接的C ++ 17,因此可以进行这样的声明。

我该如何使用它?谢谢。

1 个答案:

答案 0 :(得分:1)

  

“ Microsoft在2018年5月发布的C ++ / WinRT更新声明中声称,它是直接的C ++ 17,因此可以进行这样的声明。”

C ++ / WinRT是标准的C ++ 17,作为标准的C ++库,类型的构造函数可能会引发异常,表明您使用的是错误的。在这种情况下,构造函数将失败,因为SolidColorBrush只能在Xaml UI线程上构造。正如Raymond在他的评论中指出的那样,您需要确保在创建Xaml资源之前初始化Xaml。一种方法是使用nullptr构造函数将构造推迟到以后。例如:

SolidColorBrush brush{ nullptr };

然后在准备好并准备好后即可为画笔指定一个值。

brush = SolidColorBrush(...);