【问题标题】:I'm getting tautological compiler errors. How am I supposed to fix "argument of type "X" is incompatible with parameter of type "X"?我收到重言式编译器错误。我应该如何修复“类型“X”的参数与类型“X”的参数不兼容?
【发布时间】:2025-12-17 12:35:01
【问题描述】:

在我的情况下的具体细节:我正在使用带有AMD's vulkan memory allocator 的 MSVC,这是一个 stb 样式的单个头文件。 (所以你把它包括在你的项目中,比如:

#define VMA_IMPLEMENTATION
#include "vk_mem_alloc.h"

在单个编译单元内编译它,并且只是

#include "vk_mem_alloc.h"

在任何需要使用它的文件中。)

无论如何:

我遇到的一些具体错误示例如下:

“VmaDeviceMemoryBlock *”类型的参数与“VmaDeviceMemoryBlock *”类型的参数不兼容

“VmaSuballocationType”类型的值不能分配给“VmaSuballocationType”类型的实体

声明与“void VmaBlockMetadata::PrintDetailedMap_Allocation(VmaJsonWriter &json, VkDeviceSize offset, VmaAllocation hAllocation) const”不兼容

当定义是

void VmaBlockMetadata::PrintDetailedMap_Allocation(class VmaJsonWriter& json,
    VkDeviceSize offset,
    VmaAllocation hAllocation) const

这些错误,以及许多其他没有明显损坏的错误,绝对会乱扔文件。更奇怪的是,我可以构建程序,它可以毫无问题地编译和运行。它用这种噪音填充我的错误窗口完全破坏了错误窗口的有用性。现在我的代码中还出现了其他奇怪的错误,我不确定如何继续。

【问题讨论】:

  • 我不熟悉那个特定的库,但我想知道在 include 之前包含(或不包含)那个宏是否会以某种方式破坏单一定义规则?并试图导致两种不同的类型具有相同的名称?虽然如果是这种情况,我预计会出现不同的编译错误。
  • 您能否发布或链接完整的错误输出,或许还有一个演示问题的示例源文件(即minimal reproducible example)?
  • 我不相信——这类文件本质上是library.h >> #ifdef LIBRARY_IMPLEMENTATION >> library.c >> #endif,所以定义(“在隐喻的c文件中”)只能从#defined LIBRARY_IMPLEMENTATION之前的单个编译单元中看到包括它。 (我已经仔细检查过我已经这样做了)
  • 我在一个没有问题的大型项目中使用 VMA 和 MSVC(来自 VMA。)而且由于您似乎正确处理了最普遍的奇怪错误情况(#defining the IMPL macro in more地方多于一个,)我有两个问题(但我不希望任何一个都会导致任何事情。) 1:你确定你已经在源文件(不是头文件)中#defined IMPL 宏,并且 在所有其他#includes之后?和 2:你确定你没有循环包含、统一构建或其他会导致循环包含的奇怪设置吗?
  • 如果程序编译成功,那就是 IDE 问题。

标签: c++ visual-c++ visual-studio-2019 amd vulkan


【解决方案1】:

我在使用 Visual Studio 2019 时遇到了完全相同的一组错误。在我的情况下,错误是使用带有隐式强制转换的统一初始化。

我需要改变

uint32_t uniformOffset{ pad_uniform_buffer_size(sizeof(GPUSceneData)) * frameIndex };

uint32_t uniformOffset{ static_cast<uint32_t>(pad_uniform_buffer_size(sizeof(GPUSceneData)) * frameIndex) };

因为 pad_uniform_buffer_size 返回 size_t,而我试图通过统一初始化将其隐式转换为 uint32_t

我不知道为什么错误会出现在那个 vma 文件中,但这是我的解决方案。

【讨论】:

    最近更新 更多