2009-06-14 2 views
0

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

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

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

, но это не делает:

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

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

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

Я сделал оп < < функции шаблона, как вы предложили. Для того, чтобы сделать его друг функцией вектора класса я попытался добавить следующее определение класса Vector, но это не сработало:

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

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

+2

Вы не можете сделать какую-либо функцию другом класса без редактирования определения класса (и определения там дружбы). Можете ли вы указать, что вы пытаетесь выполнить с оператором, который требует, чтобы он был функцией друга? Вам, вероятно, не нужна дружба. –

ответ

1

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

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 «s print_on все еще можно использовать ostream.

+0

+1. Вы правы в отношении оператора <<(), который обычно не нужен, чтобы быть другом. –

5

Конечно, сделать его шаблонную функцию:

template <typename T> 
ostream& operator << (ostream &out,const Vector<T>& vec); 
+1

Стоит отметить, что вам, скорее всего, будет встроено тело функции –

2
template <class T> 
ostream& operator << (ostream &out,const Vector<T>& vec); 
Смежные вопросы