Траблы с template в VC++ 6
От: murdahlob Гондурас  
Дата: 18.02.04 14:55
Оценка:
Проблема: есть сласс примерно такой


template <class t> 
 class matrix
 {
    matrix (int, int);
  public:
    matrix operator* (matrix&); 
 };
 
template <class t> 
 class element
 {
  public:
    element operator* (element&); 
 };
 
 #typedef element<int> ReqElement;

 class ReqMat : public matrix<ReqElemnt>
 { 
  public:
   ReqMat (int, int);   
     
   ReqMat operator& (ReqMat&); 
 };
 
 ReqMat::ReqMat (int m, int n) : matrix<ReqElemnt> (m,n) 
 {
 }

 ReqMat::operator& (ReqMat& a)
 {
   return (*this)*a+a*(*this);
 }


Во первых, вопрос: можно ли сделать темплейт от темплейта без #typedef (у меня выводились ошибки компиляции).
Во вторых, проблема с оператором & из класса ReqMat. выдаётся ошибка о невозможности преобразования выраения (*this)*a+a*(*this) к типу ReqMat; Заранее спасибо
Re: Траблы с template в VC++ 6
От: Lorenzo_LAMAS  
Дата: 18.02.04 15:04
Оценка:
Здравствуйте, murdahlob, Вы писали:

M>Проблема: есть сласс примерно такой

Тайпдеф надо писать без # — это не define и не директива препроцессора. Наследовать можно так matrix<element<int> >. (*this) * a даст тип matrix<element<int> >, а где операторы сложения (если ты их просто опустил, то ладно — добавь статик_каст return static_cast<ReqMat &>(твое умножение и сложение))?

M>
M>template <class t> 
M> class matrix
M> {
M>    matrix (int, int);
M>  public:
M>    matrix operator* (matrix&); 
M> };
 
M>template <class t> 
M> class element
M> {
M>  public:
M>    element operator* (element&); 
M> };
 
M> #typedef element<int> ReqElement;

M> class ReqMat : public matrix<ReqElemnt>
M> { 
M>  public:
M>   ReqMat (int, int);   
     
M>   ReqMat operator& (ReqMat&); 
M> };
 
M> ReqMat::ReqMat (int m, int n) : matrix<ReqElemnt> (m,n) 
M> {
M> }

M> ReqMat::operator& (ReqMat& a)
M> {
M>   return (*this)*a+a*(*this);
M> } 
 
  
M>


M>Во первых, вопрос: можно ли сделать темплейт от темплейта без #typedef (у меня выводились ошибки компиляции).

M>Во вторых, проблема с оператором & из класса ReqMat. выдаётся ошибка о невозможности преобразования выраения (*this)*a+a*(*this) к типу ReqMat; Заранее спасибо
Of course, the code must be complete enough to compile and link.
Re[2]: Траблы с template в VC++ 6
От: Lorenzo_LAMAS  
Дата: 18.02.04 15:11
Оценка:
M>>Проблема: есть сласс примерно такой
L_L>Тайпдеф надо писать без # — это не define и не директива препроцессора. Наследовать можно так matrix<element<int> >. (*this) * a даст тип matrix<element<int> >, а где операторы сложения (если ты их просто опустил, то ладно — добавь статик_каст return static_cast<ReqMat &>(твое умножение и сложение))?


Спешил, проглядел — конструктор базы у тебя закрытый. Далее, оператор * возвращает объект rvalue типа matrix<T>, так как результат сложения (можно только догадываться, ведь ты оператор + выкинул) — rvalue типа matrix<T> то преобразование static_cast тут не поможет. Вообще надо яснее выражаться. И код не зажимать
Of course, the code must be complete enough to compile and link.
Re: Траблы с template в VC++ 6
От: Vamp Россия  
Дата: 18.02.04 15:15
Оценка:
M> #typedef element<int> ReqElement;
Это что еще за зверь?
M>Во первых, вопрос: можно ли сделать темплейт от темплейта без #typedef (у меня выводились ошибки компиляции).
Вот так у тебя точно будут ошибки компиляции. typedef не является распознаваемой директивой.
Подозреваю, что ты пытался пропустить пробел между двумя > >.

M>Во вторых, проблема с оператором & из класса ReqMat. выдаётся ошибка о невозможности

преобразования выраения (*this)*a+a*(*this) к типу ReqMat; Заранее спасибо
Не вижу определения оператора + для типа ReqMat.
Да здравствует мыло душистое и веревка пушистая.
Re: Траблы с template в VC++ 6
От: Кодт Россия  
Дата: 18.02.04 15:57
Оценка:
Здравствуйте, murdahlob, Вы писали:

M>
M>template <class t> 
M> class matrix
M> {
M>    matrix (int, int);
M>  public:
M>    matrix operator* (matrix&); 
M> };
 
M>template <class t> 
M> class element
M> {
M>  public:
M>    element operator* (element&); 
M> };
 
M> #typedef element<int> ReqElement;

//Это что за народное творчество?!
//typedef - конструкция языка, а не директива компилятору

M> class ReqMat : public matrix<ReqElemnt>

//Могу поспорить, что у тебя были ошибки, когда ты писал
class ReqMat : public matrix<element<int>>
//лексический парсер воспринимает >> как одну лексему, чем несказанно удивляет синтаксического анализатора
//вставь между > > любой пробельный символ (пробел, табуляцию, перевод строки)
class ReqMat : public matrix<element<int> >

M> { 
M>  public:
M>   ReqMat (int, int);   
     
M>   ReqMat operator& (ReqMat&); 

// Оператор "битовое И" над неконстантным объектом и неконстантным правым операндом
// Правильно - так:

     ReqMat operator& (ReqMat const&) const;

// Я так понимаю, A&B = AB + BA. Ну допустим...

M> };
 
M> ReqMat::ReqMat (int m, int n) : matrix<ReqElemnt> (m,n) 
M> {
M> }

M> ReqMat::operator& (ReqMat& a)
M> {
M>   return (*this)*a+a*(*this);
// результат (*this)*a - это предок, matrix<element<int> >
// результат matrix+matrix - это опять matrix
// а у ReqMat нет конструктора ReqMat::ReqMat(matrix<element<int> > const&)
M> } 
 
  
M>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.