我正试图以下列方式重载make_uint4
:
namespace A {
namespace B {
inline __host__ __device__ uint4 make_uint4(uint2 a, uint2 b) {
return make_uint4(a.x, a.y, b.x, b.y);
}
}
}
但是当我尝试编译它时,nvcc会返回错误:
error: no suitable constructor exists to convert from "unsigned int" to "uint2"
error: no suitable constructor exists to convert from "unsigned int" to "uint2"
error: too many arguments in function call
所有这些错误都指向"return…"
行。
答案 0 :(得分:1)
我在Visual Studio + nvcc中编译它没有问题。你使用什么编译器?
如果有任何帮助:make_uint4
在vector_functions.h中定义,第170行为
static __inline__ __host__ __device__ uint4 make_uint4(unsigned int x, unsigned int y, unsigned int z, unsigned int w)
{
uint4 t; t.x = x; t.y = y; t.z = z; t.w = w; return t;
}
<强>更新强>
当我在自定义命名空间内尝试重载函数时,我得到类似的错误。你确定你不在里面吗?如果是这样,请尝试将::
放在函数调用前面以引用全局范围,即:
return ::make_uint4(a.x, a.y, b.x, b.y);
答案 1 :(得分:1)
我能够在VS 2010和CUDA 4.0上获得部分repro(编译器构建了代码OK但Intellisense标记了您看到的错误)。请尝试以下方法:
#include "vector_functions.h"
inline __host__ __device__ uint4 make_uint4(uint2 a, uint2 b)
{
return ::make_uint4(a.x, a.y, b.x, b.y);
}
这为我解决了。
答案 2 :(得分:0)
我没有库代码,但似乎编译器不喜欢重载的设备函数(因为它们被视为真正花哨的内联宏)。使用新make_uint4(a,b,c,d)
对旧make_uint4(va, vb)
进行阴影(隐藏)并尝试使用4个uint参数调用后者。这不起作用,因为没有从uint到uint2的转换(如前两个错误消息所示),而且有4个而不是2个参数(最后一条错误消息)。
使用稍微不同的功能名称,例如make_uint4_from_uint2s
,你会没事的。