VC++ 转换器不是命名空间的成员

VC++ Converter is not a member of namespace

原问题

我正在尝试使我的 XAML 设计中的某些宽度依赖于其他宽度。为了实现这一点,我发现我需要使用 IValueConverter 来实现绑定。几乎可以归结为 this question (or, for a more detailed post, click here).

的方法

我的代码相当简单,但它不断产生以下错误:error C2039: 'GridViewWidthConverter': is not a member of 'MyNamespace'。为什么?

现在,我的 XAML 代码的相关部分如下所示:

<Page
    ...
    xmlns:local="using:MyNamespace"
    ...>

    <!-- Horizontal scrolling grid -->
    <GridView>
        <GridView.Resources>
            <local:GridViewWidthConverter x:Key="GridViewWidthConverter" />
        </GridView.Resources>
    ...
    </GridView>
    ...
</Page>

GridViewWidthConverter.h:

#pragma once

#include "pch.h"

using namespace Platform;
using namespace Windows::UI::Xaml::Data;
using namespace Windows::UI::Xaml::Interop;


namespace MyNamespace
{
    public ref class GridViewWidthConverter sealed : IValueConverter
    {
    public:
        GridViewWidthConverter();
        virtual ~GridViewWidthConverter();
        virtual Object^ Convert(Object^ value, TypeName targetType, Object^ parameter, String^ language);
        virtual Object^ ConvertBack(Object^ value, TypeName targetType, Object^ parameter, String^ language);
    };
}

GridViewWidthConverter.cpp:

#include "pch.h"
#include "GridViewWidthConverter.h"

using namespace MyNamespace;

// Constructor
GridViewWidthConverter::GridViewWidthConverter(){}

// Destructor
GridViewWidthConverter::~GridViewWidthConverter(){}

Object ^ GridViewWidthConverter::Convert(Object ^ value, TypeName targetType, Object ^ parameter, String ^ language)
{
    return value;
}

Object ^ GridViewWidthConverter::ConvertBack(Object ^ value, TypeName targetType, Object ^ parameter, String ^ language)
{
    return value;
}

编辑

完整的错误说明如下:

Error C2039: 'GridViewWidthConverter': is not a member of 'MyNamespace'\generated files\xamltypeinfo.g.cpp, line 200

Error C2065: 'GridViewWidthConverter': undeclared identifier\generated files\xamltypeinfo.g.cpp, line 200

Error C2440: 'initializing': cannot convert from 'overloaded-function' to 'Platform::Object ^(__cdecl *)(void)'\generated files\xamltypeinfo.g.cpp, line 252

非常感谢!

在 header 命名空间名称被声明为 namespace MyNamespace; 但在 cpp 文件中它是 using namespace MyNameSpace; (注意大小写差异)。 C++ 和 C++/Cx 都是 case-sensitive 语言,所以 MyNamespaceMyNameSpace 是两个不同的标识符。

您的 header 还包括预编译的 header 和全局 using 指令。

我花了一段时间,但我通过删除导致错误的 XAML 代码、构建项目、重建项目、重新添加代码并开始新构建来解决我的问题,或者调试会话。 Stack Overflow 上有很多这样的 "solutions",但是,这个问题的真正原因对我来说仍然不清楚。

致还在苦苦挣扎的人:

XamlTypeInfo.g.cpp 是一个生成的文件,它将包括:pch.h、App.xaml.h、App.g.hpp、*.xaml.h 和 *.g.hpp header 个文件,用于您应用中的每个 XAML 页面。生成该文件以便它知道您的应用程序中的所有可绑定类型,以便在 XAML 解析器遇到它们时可以实例化它们。

如果您的转换器类型未以某种方式包含在其中一个 header 文件中,那么您将收到此错误。如果您将 header 文件#include pre-compiled header、App.xaml.h header 或其他 *.xaml.h header 文件然后它应该清除。 (生成 .g.hpp 文件,因此您对它们所做的任何更改都不会保留。)可能最好只是将它 #include 在 pch.h header 中,因为那时类型将是在所有 CPP 文件中已知和可访问,并且将避免编译 PCH 本身的任何问题。

来源:link