No se puede sobrecargar la función make_uint4
-
26-10-2019 - |
Pregunta
Estoy tratando de sobrecargar make_uint4
en la siguiente manera:
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);
}
}
}
Pero cuando intento compilarlo, NVCC devuelve un error:
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
Todos estos errores apuntan al "return…"
línea.
Solución
Pude obtener una repro parcial en VS 2010 y CUDA 4.0 (el compilador construyó el código bien, pero Intellisense marcó el error que está viendo). Prueba lo siguiente:
#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);
}
Esto me lo arregló.
Otros consejos
No tengo problemas para compilarlo en Visual Studio+NVCC. Qué compilador estas usando?
Si eso fuera de alguna ayuda: make_uint4
se define en vector_functions.h, línea 170 como
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;
}
Actualizar:Recibo un error similar cuando intento sobrecargar la función mientras estoy dentro de mi espacio de nombres personalizado. ¿Estás seguro de que no estás dentro de uno? Si es así, intente poner ::
frente a la llamada de función para referirse al alcance global, es decir:
return ::make_uint4(a.x, a.y, b.x, b.y);
No tengo el código de la biblioteca, pero parece que al compilador no le gustan las funciones de dispositivos sobrecargados (ya que se tratan como macros en línea realmente elegantes). Lo que hace es sombra (esconder) el viejo make_uint4(a,b,c,d)
con tu nuevo make_uint4(va, vb)
e intente llamar a este último con 4 parámetros UINT. Eso no funciona porque no hay conversión de UINT a UINT2 (como lo indica los dos primeros mensajes de error) y hay 4 en lugar de 2 argumentos (el último mensaje de error).
Use un nombre de función ligeramente diferente como make_uint4_from_uint2s
y estarás bien.