Как добавить оператор << для шаблонного класса? - PullRequest
0 голосов
/ 06 декабря 2018

Мне нужно добавить оператор <<, чтобы мой cout работал. </p>

Код template.cpp:

#include "maptemplate.h"

int main(void)
{
typedef unsigned int ID;                            //Identification number of Employee
map_template<ID,Employee> Database;                 //Database of employees

Database.Add(761028073,Employee("Jan Kowalski","salesman",28));     //Add first employee: name: Jan Kowalski, position: salseman, age: 28,
Database.Add(510212881,Employee("Adam Nowak","storekeeper",54));    //Add second employee: name: Adam Nowak, position: storekeeper, age: 54
Database.Add(730505129,Employee("Anna Zaradna","secretary",32));    //Add third employee: name: Anna Zaradna, position: secretary, age: 32

//cout << Database << endl;                         //Print databese

//map_template<ID,Employee> NewDatabase = Database; //Make a copy of database

Employee* pE;
pE = Database.Find(510212881);       //Find employee using its ID
pE->Position = "salesman";          //Modify the position of employee
pE = Database.Find(761028073);     //Find employee using its ID
pE->Age = 29;             //Modify the age of employee

//Database = NewDatabase;    //Update original database

///cout << Database << endl;  //Print original database
cout<<"Wszystko dziala"<<endl;
}

Код: template.h

#include <iostream>
#include <vector>

using namespace std;

// Początek klasy Employee bez template
class Employee
{
 private:
 public:
 Employee(string Name, string Position, int Age);
 string Name;
 int Age;
 string Position;

}; // koniec klasy employee

// Dodanie pól Name, Age, Position
Employee::Employee(string Name, string Position, int Age)
{
this->Name = Name;
this->Age = Age;
this->Position = Position;
}

template <class Key, class T> // template <klucze, dane pracownikow>
class map_template
{
private:
vector<Key> keys; // vector do przechowywania unikalnych kluczy pracowników
vector<T> content; // vector do przechowywania danych pracowników
public:
map_template()
{
}
void Add(Key key, T t);
T* Find(Key key);
}; // koniec klasy map_template

// Dodanie do bazy (Add)
template <class Key, class T>
void map_template<Key, T>::Add(Key key, T t)
{
keys.push_back(key);
content.push_back(t);
}
// Szukanie w bazie (Find)
template <class Key, class T>
T* map_template<Key, T>::Find(Key key)
     {
      for (unsigned int i = 0; i < keys.size(); i++)
        if (keys[i] == key)
        {
            return &content.at(i);
        }
    return nullptr;
}

Я думал, как я должен смотреть на это.Это мой первый раз, когда я использую шаблоны, поэтому я не знаю, как должен выглядеть operator <<.</p>

Думал о чем-то вроде:

friend ostream & operator<< (ostream & s, teamplate<something>); 

Но на самом деле не знаю, как его добавить.Мне нужно

cout << Database << endl;  

для правильной работы.Извините за комментарии на польском языке.

Редактировать:

Я пытался поместить это объявление о дружбе в класс Employee, но я продолжаю получать ошибки :( код:

class Employee
{
private:

public:
Employee(string Name, string Position, int Age);
string Name;
int Age;
string Position;
friend ostream &operator << (ostream &out, const map_template<Key, T> &map);
}

ошибки:

 maptemplate.h:49:63: error: ‘Key’ was not declared in this scope
 friend ostream &operator << (ostream &out, const map_template<Key, T> &map);
                                                           ^~~
 maptemplate.h:49:68: error: ‘T’ was not declared in this scope
 friend ostream &operator << (ostream &out, const map_template<Key, T> &map);
                                                                ^
 maptemplate.h:49:69: error: template argument 1 is invalid
 friend ostream &operator << (ostream &out, const map_template<Key, T> &map);
                                                                 ^
 maptemplate.h:49:69: error: template argument 2 is invalid
 maptemplate.h: In instantiation of ‘std::ostream& operator<<(std::ostream&, const                     
 map_template<Key, T>&):

Должен ли я изменить объявление или что-то другое? Я знаю, что Ключ и T находятся в частном порядке. Может быть, так? Кто-нибудь может помочь? Я начинающий так:/

1 Ответ

0 голосов
/ 06 декабря 2018

Вы хотите:

template <class Key, class T>
std::ostream& operator << (std::ostream& out, const map_template<Key, T>& map) {
    // your logic on how to output the map here...
    return out;
}

, поэтому ваш operator<< будет работать с map_template любой специализации.

Очевидно, что ваш подход friend также подойдет, плюс вына самом деле сбросит ненужную строку template.Если вы поместите вашу декларацию operator << в вашем классе, это:

friend std::ostream& operator << (std::ostream& out, const map_template<Key, T>& map) {
    // your logic on how to output the map here..
    return out;
}

подойдет.Обратите внимание на отсутствие повторного template <class Key, class T>.Внутри вашего класса - эти типы шаблонов видны, и поэтому вы можете использовать их.

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