Не удается перегрузить функцию make_uint4 - PullRequest
0 голосов
/ 16 марта 2011

Я пытаюсь перегрузить 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…".

Ответы [ 3 ]

1 голос
/ 16 марта 2011

У меня нет проблем с компиляцией в 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 голос
/ 17 марта 2011

Мне удалось получить частичное воспроизведение на VS 2010 и CUDA 4.0 (компилятор собрал код, но 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);
}

Это исправило это для меня.

0 голосов
/ 16 марта 2011

У меня нет библиотечного кода, но кажется, что компилятору не нравятся перегруженные функции устройства (так как они обрабатываются как действительно красивые встроенные макросы).Что делает, это затеняет (скрывает) старый make_uint4(a,b,c,d) с вашим новым make_uint4(va, vb) и пытается вызвать последний с 4 параметрами uint.Это не работает, потому что нет преобразования из uint в uint2 (как указано в первых двух сообщениях об ошибках), и вместо четырех аргументов (последнее сообщение об ошибке) есть 4 вместо.

Используйте немного другую функциюимя, как make_uint4_from_uint2s, и все будет в порядке.

...