为什么使用运算符 class_name() 和 c 样式转换时 g++ 上出现错误

Why there is a error on g++ when using operator class_name() & c style cast

本文关键字:转换 样式 g++ 错误 运算符 class name 为什么      更新时间:2023-10-16

最小、完整和可验证的示例:

OpenCL C++包装器 API 1.2(修订版 09)中的必需标头

#include <cl/cl.hpp>
class TBuffer
{
public:
    // some code
    operator cl::Buffer& ();
    operator cl_mem ();
    // some code
private:
    // some code
    cl::Buffer m_Buffer;
    // some codes
};
TBuffer::operator cl::Buffer& ()
{
    return m_Buffer;
}
TBuffer::operator cl_mem ()
{
    return (cl_mem) m_Buffer();
}
class TMatrix : public TBuffer
{
};
int main(int argc, char* argv[])
{
    TMatrix mat;
    cl::Kernel kernel;
    kernel.setArg(0,(cl::Buffer)mat);
    return 0;
}

该代码在Visual Studio 2012上运行良好,但在G ++ 4.9.2上出现错误:

test.cpp: In function 'int main(int, char**)':
test.cpp:35:30: error: call of overloaded 'Buffer(TMatrix&)' is ambiguous
  kernel.setArg(0,(cl::Buffer)mat);

我解决了它,在cl::Buffer后面添加和,就像这样:

m_kernel.setArg(10, (cl::Buffer&)_img_src);

但我仍然不知道为什么它在Visual Studio上运行良好。

感谢您在回答中提供的信息,我想我知道问题是什么。

m_kernelsetArg很可能通过引用(即cl::Buffer&)来接受它的论证。

转换为值类型的复制构造该类型的临时。但是,临时不能绑定到非常量引用,因此不能将其传递给setArg

此外,setArgs可能还有两个重载,这两个重载都可以通过将临时隐式转换为其参数的类型来调用。但是,由于这两个函数同样有效,因此重载解析失败并显示"不明确的调用"错误。

强制转换为引用类型会产生引用,因此第一次重载是完全匹配的,这里没有问题。

它与 MSVC 一起使用的原因是,默认情况下,它启用一个扩展,该扩展确实允许非const引用绑定到临时引用。因此,以前不兼容的第一个重载现在被选为完全匹配,先于其他重载。