Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> перегрузка операции вывода в шаблоне 
V
    Опции темы
Kuvaldis
Дата 16.6.2006, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Помогите, так как уже вырвал на себе последние волосы. Проблема в шаблоне ниже с перегрузкой оператора вывода (дружественная шаблонная функция). Проверил, вроде бы все правильно. Но: 6 visual компилирует без проблем, в то время как builder 6 и visual 8 не хотят: выдается ошибка трансляции 

//--------------------------------------------------------------------------- 
#include <iostream> 
using namespace std;
//---------------------------------------------------------------------------
const int DefaultSize = 10;
//---------------------------------------------------------------------------
template <class T>
class Array
{
    private: 
       T* pType;
       int itsSize;
    public:
   // constructors 
       Array(int size = DefaultSize); // параметр по умолчанию
       Array(const Array & rhs); 
      ~Array() { delete [] pType; } 
   // operators
      Array & operator = (const Array & theArray);
      T & operator [] (int offset) { return pType[offset]; }
      const T & operator [] (int offset) const { return pType[offset]; } // для конструктора копий
    // access methods
     int GetSize() const { return itsSize; }

     friend ostream & operator << (ostream & output, Array<T> & );  // !!!!!!!!!!!!!!!!!!!!!!!
};
//---------------------------------------------------------------------------
template <class T>
ostream & operator << (ostream & output, Array<T> & theArray);
//---------------------------------------------------------------------------
int main(int argc, char* argv[])
{
     int i, n;
     Array <int> theArray; 

     n = theArray.GetSize();
     for(i = 0; i < n; i++)
        theArray[i] = i * 2;

     cout <<  theArray; 


     cin >> i;
     return 0;
}
//---------------------------------------------------------------------------
template <class T>
Array<T>::Array(int size) : itsSize(size)
{
    pType = new T[size]; 
    for(int i = 0; i < size; i++)
    pType[i] = 0;
}
//---------------------------------------------------------------------------
template <class T>
Array<T>::Array(const Array & rhs)
{
    itsSize = rhs.itsSize;
    pType = new T[itsSize];
     for(int i = 0; i < itsSize; i++)
          pType[i] = rhs[i];
}
//---------------------------------------------------------------------------
template <class T>
Array<T> & Array<T>::operator = (const Array & theArray)
{
       if(this == &theArray)
         return *this;
       itsSize = rhs.itsSize;
       delete [] pType;
       pType = new T[itsSize];
       for(int i = 0; i < itsSize; i++)
       pType[i] = theArray[i];
       return *this;
}
//---------------------------------------------------------------------------
template <class T>
ostream & operator << (ostream & output, Array<T> & theArray)
{
      for(int i = 0; i < theArray.GetSize(); i++)
         output << "Array[" << i << "] = " << theArray[i] << endl;
      return output; 
}
//---------------------------------------------------------------------------
Код


 smile  smile  


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
MAKCim
Дата 16.6.2006, 11:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Код

template<class T> class Array;

template<class T> ostream& operator<<(ostream&, Array<T>&);

template<class T> class Array
{
...
    friend ostream& operator<< <>(ostream&,Array<T>&);
...
};

template<class T> ostream& operator<<
    (ostream& stream, Array<T>& obj)
{
...
}
 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Kuvaldis
Дата 16.6.2006, 11:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: 11
Всего: 61



Спасибо за ответ , так как 2 дня бился на решением.
Еще один вопрос по теме. Ни в одной книге не видел такой конструкции:
friend ostream& operator<< <>(ostream&,Array<T>&);
я про символ  <> после оператора вывода. Где про это посмотреть или для чего это нужно?
 


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Fazil6
Дата 16.6.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата

я про символ  <> после оператора вывода.

тоже самое <class T>, просто нет указания типа 
PM MAIL   Вверх
MAKCim
Дата 16.6.2006, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Где про это посмотреть или для чего это нужно?

Страуструп (ЯП C++, стр. 931)
а для чего нужно - чтобы указать компилятору, что дружественная функция - шаблон 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0467 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.