为什么使用运算符 class_name() 和 c 样式转换时 g++ 上出现错误
Why there is a error on g++ when using operator class_name() & c style cast
最小、完整和可验证的示例:
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_kernel
的setArg
很可能通过引用(即cl::Buffer&
)来接受它的论证。
转换为值类型的复制构造该类型的临时。但是,临时不能绑定到非常量引用,因此不能将其传递给setArg
。
此外,setArgs
可能还有两个重载,这两个重载都可以通过将临时隐式转换为其参数的类型来调用。但是,由于这两个函数同样有效,因此重载解析失败并显示"不明确的调用"错误。
强制转换为引用类型会产生引用,因此第一次重载是完全匹配的,这里没有问题。
它与 MSVC 一起使用的原因是,默认情况下,它启用一个扩展,该扩展确实允许非const
引用绑定到临时引用。因此,以前不兼容的第一个重载现在被选为完全匹配,先于其他重载。
相关文章:
- 如何修复函数样式强制转换或类型构造的预期"("?
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- C 样式转换引用
- C++显式类型转换(C 样式强制转换)的强制表示法和static_cast的多种解释
- 枚举类的 C 样式强制转换到基础类型 char 的引用
- C++:禁用 CMake 中的旧样式转换警告
- 替换 c++ 中的 c 样式强制转换 (long&)
- 我需要将阵列样式的邻接矩阵转换为矢量样式(以使其看起来更好)
- 用于 protobuf 转换的大括号初始化样式构造函数
- 将 c 样式强制转换转换为正确的 c++ 转换
- Windows VC++编译器允许一种奇怪的c样式转换方式(或者它可能不是转换??)
- 如何将C++继承的带有函数的类转换为C样式?
- 使用C库的C 程序 - 将智能指针转换为RAW C样式指针
- 从整数到枚举的首选转换样式 QEvent::Type
- 转换为C样式字符串
- interpret_cast和c样式强制转换是否兼容(按照c++标准)
- 将C样式铸造为C 样式铸造的转换
- 以 c++11 样式键入转换的正确方法
- 为什么 C 样式的转换有效,而reinterpret_cast则无效?
- calloc c c样式指针转换为c++转换样式