VC ++ Converter不是命名空间的成员

时间:2017-05-17 17:48:01

标签: xaml visual-c++ namespaces uwp c++-cx

原始问题

我正在尝试在我的XAML设计中制作一些宽度,这取决于其他宽度。为了实现这一点,我发现我需要使用IValueConverter来实现绑定。几乎归结为this question的方法(或者,更详细的帖子,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

非常感谢!

3 个答案:

答案 0 :(得分:1)

在标头命名空间名称中声明为namespace MyNamespace;但在cpp文件中它是using namespace MyNameSpace;(注意案例差异)。 C ++和C ++ / Cx都是区分大小写的语言,因此MyNamespaceMyNameSpace是两个不同的标识符。

此外,您的标头包含预编译标头,并具有全局using指令。

答案 1 :(得分:1)

对于仍在苦苦挣扎的人:

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

如果您的转换器类型不是以某种方式包含在其中一个头文件中,那么您将收到此错误。如果#include你的头文件在预编译的头文件,App.xaml.h头文件,或其他* .xaml.h头文件之一,那么它应该清理。 (生成.g.hpp文件,因此您对它们所做的任何更改都将无法生存。)最好只在#chlude头文件中包含它,因为这样的类型将在所有CPP文件中被识别和访问。将避免编译PCH本身的任何问题。

来源:link

答案 2 :(得分:0)

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