【问题标题】:C2039: 'Method'+W is not a member of ClassC2039:“方法”+W 不是类的成员
【发布时间】:2016-12-11 13:51:47
【问题描述】:

在我的项目中,我声明了一个名为 ReplaceFile 的函数,但是在我的 cpp 中引用它时,我得到了最奇怪的错误。它在我编写的方法的末尾附加了一个“W”。

为什么它会认为我写了 ReplaceFileW?我已经对 ReplaceFileW 进行了项目搜索,但结果一无所获。

如果您需要其他任何内容,请发表评论,否则,这是一个简单的解决方法吗?

这是 ReplaceFile 标头中的声明,它是重载的:

 // Description: replace an existing file into the package
void ReplaceFile(std::string path, std::string pathInPackage, void(*replaceProgress)(void*, DWORD,
        DWORD) = NULL, void *arg = NULL);

// Description: replace an existing file into the package
void ReplaceFile(std::string path, StfsFileEntry *entry, std::string pathInPackage,
        void(*replaceProgress)(void*, DWORD, DWORD) = NULL, void *arg = NULL);

感谢您的宝贵时间。

【问题讨论】:

  • @sashoalm:我认为第一个与重复很接近,但这是一个负面质量问题(OP 将幻想作为事实而不是事实)。
  • @Cheersandhth.-Alf 请相信我,我确实尝试过搜索我的问题。但是是的,第一个在我看来确实是重复的,但没有包含明确的解决方案
  • @mc360pro 我发布了它们,因此它们出现在链接部分(您自己的问题将出现在其中)。

标签: c++ qt class methods


【解决方案1】:

这是因为 Windows 函数ReplaceFile。与几乎所有 WINAPI 函数一样,它有两种变体:

  1. ReplaceFileW 用于宽字符串
  2. ReplaceFileA 用于 ASCII 字符串

使用哪一个取决于UNICODE 宏。这就是问题所在:符号ReplaceFile 只是一个预处理器宏,它根据UNICODE 宏扩展为ReplaceFileW 或ReplaceFileA。和所有宏一样,它是无条件扩展的。

解决方案:在包含 Windows 系统头文件后取消定义 ReplaceFile 宏:

#include <windows.h>
#undef ReplaceFile

【讨论】:

  • 人们也可以使用使用不同名称的古老力量。
  • 嗯,我将#undef ReplaceFile 放在每个 windows.h 包含下,它没有任何区别。让我稍微修补一下......
  • @molbdnilo 并非总是如此,它可能来自第三方库。
  • @Cheersandhth.-Alf 我同意你的观点,但就像我在之前的评论中所说的那样,重命名符号并不总是可能的。即使源代码可用并且正在从源代码构建库,重命名符号并将其推送到上游也是不可行的,这意味着必须维护库的特殊分支。
  • @mc360pro:据我了解,如果您的 cmets 提供了该功能,则该功能是由第 3 方库提供的。最好将该信息添加到问题中(确保在发布此答案后明确添加了该信息)。在这种情况下,只需按照我的建议进行操作,即编译器防火墙。从该翻译单元导出 replace_file 包装函数。 &lt;windows.h&gt; 的神奇包含可能是通过预编译的头文件&lt;stdafx.h&gt;。但它也可以是强制包含。检查您的项目设置。必要时修复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
相关资源
最近更新 更多