приведение к классу шаблона с использованием пользовательского оператора приведения

У меня есть класс, унаследованный от двух классов, один из которых является моим собственным базовым классом, и класс шаблона:

typedef typename cusp::csr_matrix< int,
float,
cusp::host_memory > csr_matrix;

class CuspMatrix
:
public csr_matrix,
public Matrix
{
...
}

В какой-то момент мне нужно выполнить присваивание, которое скопирует объект базового класса с хоста на устройство следующим образом:

cusp::csr_matrix<int,float,cusp::host_memory> A(4,3,6);
cusp::csr_matrix<int,float,cusp::device_memory> A = B;

но прежде чем я смогу это сделать, я должен этот в его базовый класс csr_matrix

Я пробовал с static_cast и пользовательский оператор приведения:

operator csr_matrix()
{
return *( cusp::csr_matrix< int,float,cusp::device_memory> *)this;
}

Однако, когда я пытаюсь сделать что-то реальное, я получаю тонны ошибок от компилятора.

cusp::csr_matrix<int,float,cusp::device_memory> mtx = *(csr_matrix *)this;

На самом деле, статическое литье также вне моего понимания на данный момент:

auto me = static_cast<csr_matrix>( *this );
cusp::csr_matrix<int,float,cusp::device_memory> mtx = me;

тем не менее, похоже, что выстрел из дробовика в стиле C без typedef работает:

auto me = *( cusp::csr_matrix< int,
float,
cusp::host_memory> *)this;

но терпит неудачу с typedef:

auto me = *( csr_matrix *)this;
  • Итак, как я могу безопасно выполнить приведение, используя мой собственный оператор, предпочтительно
    используя статическое приведение?

  • Почему приведение с полным пространством имен :: type работает, но не работает с typedef?

0

Решение

cusp::csr_matrix<int,float,cusp::device_memory> mtx = *(csr_matrix *)this;

Это приведение никогда не может вызвать функцию преобразования, потому что тип операнда this из приведенного выражения CuspMatrix*, Функция преобразования будет рассматриваться только тогда, когда тип операнда является типом класса:

cusp::csr_matrix<int,float,cusp::device_memory> mtx = (csr_matrix)*this;

В этом сценарии csr_matrix уже является общедоступным базовым классом CuspMatrix — так что функция преобразования CuspMatrix::operator csr_matrix(), никогда не может быть назван.

Это преобразование вверх не требует приведения — когда this имеет тип CuspMatrix* а также cusp::csr_matrix<int,float,cusp::device_memory> поддерживает назначение из cusp::csr_matrix<int,float,cusp::host_memory>, вы должны быть в состоянии сделать это:

cusp::csr_matrix<int,float,cusp::device_memory> mtx = *this;

Не видя реальных сообщений об ошибках и скомпилированного примера, трудно ответить на второй вопрос.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]