используя шаблонный класс в качестве аргумента - PullRequest
0 голосов
/ 14 июня 2009

Есть ли способ создания функции, которая принимает любую версию данного шаблон класса?

например. это работает:

ostream& operator << (ostream &out,const Vector<int>& vec);

но это не так:

ostream& operator << (ostream &out,const Vector& vec);

Можно ли как-то заставить работать вторую строку для любой версии вектора? например vector<int> и vector<double> без необходимости писать 2 отдельные функции?

Добавлено к вопросу:

Я сделал оп << функцию шаблона, как вы предложили. Чтобы сделать его функцией-другом класса vector, я попытался добавить следующее в определение класса Vector, но это не сработало: </p>

friend ostream& operator << (ostream &out, const Vector<T>& vec); 

есть идеи, что можно сделать, чтобы это исправить?

Ответы [ 3 ]

5 голосов
/ 14 июня 2009

Конечно, сделайте это функцией шаблона:

template <typename T>
ostream& operator << (ostream &out,const Vector<T>& vec);
2 голосов
/ 14 июня 2009
template <class T>
ostream& operator << (ostream &out,const Vector<T>& vec);
1 голос
/ 14 июня 2009

Как уже отмечалось, что-то вроде этого должно работать:

template <typename T>
ostream& operator << (ostream &out,const Vector<T>& vec) {
    // body here
}

Что касается требования друга, с ним легче всего справиться так:

template <typename T>
ostream& operator << (ostream &out,const Vector<T>& vec) {
    vec.print_on( out );
    return out;
}

Однако , обычно я думаю, что любой оператор вывода, подобный этому, требует, чтобы доступ к внутренним компонентам класса показал вам ошибку в вашем Vector классе. На самом деле для отображения требуется только использовать общедоступный интерфейс.

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

template <typename O, typename C, typename T>
std::basic_ostream<O, C>& operator << (std::basic_ostream<O, C> &out,const Vector<T>& vec) {
    vec.print_on( out );
    return out;
}

Vector print_on все еще может использовать ostream.

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