Проблема: есть сласс примерно такой
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; Заранее спасибо
Здравствуйте, 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; Заранее спасибо
M>>Проблема: есть сласс примерно такой
L_L>Тайпдеф надо писать без # — это не define и не директива препроцессора. Наследовать можно так matrix<element<int> >. (*this) * a даст тип matrix<element<int> >, а где операторы сложения (если ты их просто опустил, то ладно — добавь статик_каст return static_cast<ReqMat &>(твое умножение и сложение))?
Спешил, проглядел — конструктор базы у тебя закрытый. Далее, оператор * возвращает объект rvalue типа matrix<T>, так как результат сложения (можно только догадываться, ведь ты оператор + выкинул) — rvalue типа matrix<T> то преобразование static_cast тут не поможет. Вообще надо яснее выражаться. И код не зажимать
M> #typedef element<int> ReqElement;
Это что еще за зверь?
M>Во первых, вопрос: можно ли сделать темплейт от темплейта без #typedef (у меня выводились ошибки компиляции).
Вот так у тебя точно будут ошибки компиляции. typedef не является распознаваемой директивой.
Подозреваю, что ты пытался пропустить пробел между двумя > >.
M>Во вторых, проблема с оператором & из класса ReqMat. выдаётся ошибка о невозможности
преобразования выраения (*this)*a+a*(*this) к типу ReqMat; Заранее спасибо
Не вижу определения оператора + для типа ReqMat.
Здравствуйте, 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>