Преобразование типов шаблонов - PullRequest
0 голосов
/ 14 сентября 2009

Я строю матричный шаблон. Есть операторы, функции и все отлично работают. За исключением случаев, когда я пытаюсь преобразовать матрицу двойного типа в матрицу типа int (или наоборот). Оператор = не может быть определен, поэтому невозможно переопределить его для basic_Matrix2D и basic_Matrix2D, внешних для класса. Я знаю, что могу написать в операторах класса = для преобразования, но в этом случае будет два оператора = с теми же параметрами. При использовании double в качестве параметра шаблона преобразование из double будет таким же, как преобразование из параметра шаблона. Определение класса приведено ниже, коды доступны из SourceForge

template <class _T> class basic_Matrix2D {

}

Есть еще одна проблема, которую я запомнил в шаблонах: преобразование в указатель типа шаблона работает, а преобразование в тип шаблона - нет. Это может зависеть от компилятора. соблюдать:

operator _T() {
   return something;
}

operator _T*() {
   return somethingelse;
}

Заранее спасибо,
Cem

Ответы [ 2 ]

5 голосов
/ 15 сентября 2009

Ваш вопрос очень неясен, но нет ничего плохого в том, чтобы заставить оператора = что-то вроде этого:

// incomplete, but you get the idea
template<class U>
basic_Matrix2D<T> & operator=(const basic_Matrix2D<U> &x)
{
    rows = x.rows;
    cols = x.cols;
    data = new T[rows * cols];
    for (size_t i = 0; i < rows * cols; ++i)
        data[i] = x.data[i];
}

Это позволит вам назначать из любой матрицы, где выражение T t; t = U(); правильно сформировано. И если вы не можете, он не скомпилируется. Вы также можете включить простой оператор присваивания basic_Matrix2D<T> & operator=(const basic_Matrix2D<T> &); - возможно, вы сможете получить дополнительную эффективность или что-то из этого.

1 голос
/ 15 сентября 2009

Я думаю, что было бы весьма необычно предоставить «конструктор преобразования»:

template <class U>
Matrix2D<T>(const Matrix2D<U>&)

Это должно автоматически заставить все работать, например

Matrix2D<double> a;
Matrix2D<int> b;
//implicitly uses the conversion constructor to create a temporary Matrix2D<double> from b
a += b; 

Даже если создание временного объекта будет слишком дорогим, вы можете определить все операторы, чтобы операнды могли представлять собой разные типы матриц.

Операторы преобразования, однако, являются тупиковыми. Они просто мутят воду.

P.S Я также посмотрел ссылки на ваш проект. Какова цель переизобретения связанного списка, особенно если его интерфейс полностью несовместим с SC ++ L? (Даже древняя библиотека, такая как wxWidgets, предоставляла альтернативный и предпочтительный STL-совместимый интерфейс для их wxString.)


Редактировать: Что касается проблемы вашего оператора преобразования, с каким компилятором он не компилируется?

template <class T>
struct X
{
    int n;

    operator T() { return n; }
    operator T*() { return &n; }
};

int main()
{
    X<int> x = {42};
    int a = x;
    int* b = x;
}

Обратите внимание, что это может рассматриваться как злоупотребление перегрузкой операторов, которое определенно не сделает ваш код чище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...