Как насчет косые деревья ?
кроме того, Chris Okasaki чисто функциональные структуры данных приходят на ум.
Вы объявляете operator << как возвращающий ostream &, но в этом методе вообще нет оператора возврата. Должно быть:
template <class T, class U>
ostream& operator<<(ostream& out, Pair<T,U>& v)
{
return out << v.val1 << " " << v.val2;
}
Кроме этого, у меня нет проблем или предупреждений при компиляции вашего кода в Visual Studio 2008 с предупреждениями на уровне 4. О, есть классические ошибки компоновщика, но их легко обойти, переместив определение функции шаблона в объявление класса, как описано в C ++ FAQ .
Мой тестовый код:
#include <iostream>
using namespace std;
template <class T, class U>
class Pair{
public:
Pair(T v1, U v2) : val1(v1), val2(v2){}
~Pair(){}
Pair& operator=(const Pair&);
friend ostream& operator<<(ostream& out, Pair<T,U>& v)
{
return out << v.val1 << " " << v.val2;
}
private:
T val1;
U val2;
};
int main() {
Pair<int, int> a(3, 4);
cout << a;
}
Вы хотите сделать один-единственный экземпляр (называемый «специализацией» в общих терминах) этого шаблона другом. Вы делаете это следующим образом
template <class T, class U>
class Pair{
public:
Pair(T v1, U v2) : val1(v1), val2(v2){}
~Pair(){}
Pair& operator=(const Pair&);
friend ostream& operator<< <> (ostream&, Pair<T,U>&);
private:
T val1;
U val2;
};
Поскольку компилятор знает из списка параметров, что аргументами шаблона являются T
и U
, вам не нужно помещать их между <...>
, поэтому их можно оставить пустыми. Обратите внимание, что вы должны поместить объявление operator <<
над шаблоном Pair
, как показано ниже:
template <class T, class U> class Pair;
template <class T, class U>
ostream& operator<<(ostream& out, Pair<T,U>& v);
// now the Pair template definition...