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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top