2014-12-14 2 views
0

У меня есть следующий шаблон класса, который будет принимать как примитивы, так и объект. Как бы то ни было, я могу печатать только примитивы. Как я могу заставить его работать с использованием как примитивов, так и объектов? БлагодаряШаблоны Объекты и примитивы

template<class T> 

    class A 
    { 

     private: 
      vector <T> l; 
     public: 

      void print() const 
      { 
       for (int i=0;i<.size();i++) 
       { 
        cout<<l[i]<<endl; //error here 
       } 

      } 
    }; 

ответ

0

Причина, почему вы можете печатать примитивы, что <iostream> обеспечивает перегрузки для operator<< для них.

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

// This implementation puts operator << outside your class. 
// Mark it "friend" in MyClass if it needs access to private members of MyClass. 
ostream& operator<<(ostream& ostr, const MyClass& myClass) { 
    // Do the printing based on the members of your class 
    ostr << myClass.member1 << ":" << myClass.member2; 
    return ostr; 
} 

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

cout<<l[i]<<endl; 

вы можете поместить operator<< внутри класса, а также:

ostream &operator<<(ostream &os) { 
    ostr << member1 << ":" << member2; 
} 
+0

У меня ошибка слишком много параметров. Я что-то упускаю? Спасибо за вашу помощь – fbdg

+0

@fbdg Где вы видите ошибку? Здесь [ссылка на демонстрацию вашего кода с исправлением, запущенным на ideone] (http://ideone.com/KjghLo). – dasblinkenlight

+0

Я пишу этот код в своем объекте, чтобы перегрузить оператор << 'ostream & TestClass :: << (ostream & ostr, const TestClass & str) // ошибка { ostr << str.m_nproperty; return ostr; } 'И Im получает ошибку, где я указал выше: двоичный' оператор << 'имеет слишком много параметров – fbdg

0

Я предполагаю, что здесь вы хотите напечатать объект вместо переменной, относящейся к базовому типу данных.

Для таких случаев вы можете посмотреть перегрузку оператора на C++ (более конкретно, перегрузить оператор вставки).

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

http://msdn.microsoft.com/en-us/library/1z2f6c2k.aspx

Ниже приведен пример о том, как идти об этом

ostream& operator<<(ostream& os, const Datatype& dt) 
{ 
os << dt.a <<" " << dt.b; 
return os; 
} 

Здесь Datatype - это имя класса, а a и b - два частных члена a и b, которые будут напечатаны при попытке распечатать объект.

Однако, чтобы перегрузить эту технику, не забудьте сделать эту функцию как функцию друга класса (как указано ниже), поскольку функция требует доступа к частным членам класса.

friend ostream& operator<<(ostream& os, const Datatype& dt); 

Смежные вопросы