C++编译器错误在xamltypeinfo.g.cpp中。

9

我一定漏掉了一些显而易见的东西,但我不确定是什么。

我创建了一个空的C++ Metro应用程序,并添加了一个模型,我将在UI中绑定它,但我得到了一系列与xamltypeinfo.g.cpp相关的编译器错误,我不知道我漏掉了什么。

我的头文件看起来像这样:

#pragma once
#include "pch.h"
#include "MyColor.h"

using namespace Platform;

namespace CppDataBinding
{
    [Windows::UI::Xaml::Data::Bindable]
    public ref class MyColor sealed : Windows::UI::Xaml::Data::INotifyPropertyChanged
    {
    public:
        MyColor();
        ~MyColor();

        virtual event Windows::UI::Xaml::Data::PropertyChangedEventHandler^ PropertyChanged;
        property Platform::String^ RedValue
        {
            Platform::String^ get()
            { 
                return _redValue;
            }
            void set(Platform::String^ value)
            {
                _redValue = value;
                RaisePropertyChanged("RedValue");
            }
        }

    protected:
        void RaisePropertyChanged(Platform::String^ name);

    private:
        Platform::String^ _redValue;
    };
}

我的cpp文件看起来像这样:

#include "pch.h"
#include "MyColor.h"

using namespace CppDataBinding;

MyColor::MyColor()
{
}

MyColor::~MyColor()
{
}

void MyColor::RaisePropertyChanged(Platform::String^ name)
{
    if (PropertyChanged != nullptr)
    {
        PropertyChanged(this, ref new  Windows::UI::Xaml::Data::PropertyChangedEventArgs(name));
    }
}

没有太复杂的问题,但是当我编译时,在xamltypeinfo.g.cpp中会出现错误,指示CppDataBinding中未定义MyColor

相关生成的代码如下:

if (typeName == "CppDataBinding.MyColor")
{
    userType = ref new XamlUserType(this, typeName, GetXamlTypeByName("Object"));
    userType->Activator = ref new XamlTypeInfo::InfoProvider::Activator(
                            []() -> Platform::Object^ 
                            { 
                                return ref new CppDataBinding::MyColor(); 
                            });
    userType->AddMemberName("RedValue", "CppDataBinding.MyColor.RedValue");
    userType->SetIsBindable();
    xamlType = userType;
}

如果我从MyColor中删除Bindable属性,则代码将编译。

请问有人能告诉我我错过了什么显而易见的事情,以便我可以自己打脸并解决问题吗?


3
这是C++/CX。符号^称为帽子,并声明了一个引用计数智能指针。 - James McNellis
1
@g24l:这被称为跟踪引用 - Jesse Good
3
@Jesse:虽然在C++/CLI中,^是一个跟踪引用,但在C++/CX中不是。在C++/CX中没有什么需要“跟踪”的,因为对象不会移动(即没有紧凑垃圾收集器)。 - James McNellis
@JesseGood 你生气了,兄弟? - McGarnagle
@McGarnagle:不确定你指的是什么。 - Jesse Good
显示剩余7条评论
1个回答

15

我进行了一个小改变,现在它可以工作了。

我添加了

#include "MyColor.h"

尽管我还没有添加任何对MyColor的引用,但它现在可以编译,这是因为已经将BlankPage.xaml.h文件包含进来了。

我猜如果你将某个东西标记为[Bindable],则必须至少在一个xaml页面中包含其头文件才能正常工作。一个未被引用的可绑定类型会导致编译错误。


啊,是的。你的分析是正确的。这是XAML编译器的一个限制。 - James McNellis
我同意,这绝对是这种情况。我认为从清晰度的角度来看,将其放在App.xaml.h中可能更有意义,似乎是全局包含的好地方。 - guysherman
如果你的项目是一个没有任何*.xaml.h文件的自定义控件,该怎么办呢?到目前为止,我能想到的方法就是污染pch.h文件来使其工作。 - Tim Greenfield
你应该仍然拥有一个App.xaml.h文件。 - user1002973
@Tim,你不应频繁更改pch.h文件。这是用于预编译头文件的,可以让C++编译器更快地处理宏定义。每次更改它时,VS都会重新构建头文件,这可能会达到100MB之大,从而显著地破坏了原始目的。 - An Hoa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接