У меня есть класс, унаследованный от двух классов, один из которых является моим собственным базовым классом, и класс шаблона:
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?
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;
Не видя реальных сообщений об ошибках и скомпилированного примера, трудно ответить на второй вопрос.
Других решений пока нет …