C++ C2039:&x27;方法'+;W不是班上的一员

C++ C2039:&x27;方法'+;W不是班上的一员,c++,qt,class,methods,C++,Qt,Class,Methods,在我的项目中,我声明了一个名为ReplaceFile的函数,但是在我的cpp中引用它时,我得到了一个最奇怪的错误。它在我编写的方法的末尾附加了一个“W” 到底为什么它会认为我写了替换文件?我已经对ReplaceFileW做了一个项目搜索,但没有找到任何结果 如果您还需要什么,只需发表评论,否则,这是一个简单的解决方案吗 以下是ReplaceFile头中的声明及其重载: // Description: replace an existing file into the package void

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

到底为什么它会认为我写了替换文件?我已经对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);

谢谢您的时间。

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

  • ReplaceFileW
    用于宽字符串
  • ReplaceFileA
    用于ASCII字符串
  • 使用哪一种取决于
    UNICODE
    宏。问题是:符号
    ReplaceFile
    只是一个预处理器宏,它根据
    UNICODE
    宏扩展为
    ReplaceFileW
    ReplaceFileA
    。与所有宏一样,它是无条件展开的

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

    #包括
    #未定义替换文件
    
    人们也可以利用使用不同名称的古老力量。嗯,我在每个windows.h include下都放置了
    #undef ReplaceFile
    ,这没有什么区别。让我稍微修改一下…@molbdnilo并不总是可能的,它可能来自第三方库。@cheers-sandhth.-Alf我同意你的观点,但正如我在之前的评论中所说的,并不总是可能只是重命名符号。即使源代码可用,并且用户正在从源代码构建库,重命名符号并将其推送到上游也不可行,这意味着用户必须为此维护库的一个特殊分支。@mc360pro:根据您的评论,我理解该功能是否由第三方库提供。最好将这些信息添加到问题中(确保在发布此答案后添加了这些信息)。在这种情况下,只需按照我的建议,即编译器防火墙。从该翻译单元导出
    replace_文件
    wrapper函数。
    的神奇包含可能是通过预编译头
    实现的。但它也可能是一个强制包含。检查项目设置。必要时进行修正。请看和@sashoalm:我认为第一个问题很接近于重复,但这是一个负面质量问题(将幻想视为事实,而不是事实)。@Cheersandhth.-Alf请相信我,我确实试图寻找我的问题。但对我来说,第一个看起来确实像一个复制品,但不包括一个清晰的solution@mc360pro我发布了它们,因此它们会出现在链接部分(您自己的问题也会出现在其中)。
    #include <windows.h>
    #undef ReplaceFile