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 语言,所以 MyNamespace
和 MyNameSpace
是两个不同的标识符。
您的 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
原问题
我正在尝试使我的 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 语言,所以 MyNamespace
和 MyNameSpace
是两个不同的标识符。
您的 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