Перегрузка друга оператор <<для шаблонного класса

Как насчет косые деревья ?

кроме того, Chris Okasaki чисто функциональные структуры данных приходят на ум.

28
задан trikker 19 August 2009 в 02:48
поделиться

2 ответа

Вы объявляете 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;      
}
20
ответ дан 28 November 2019 в 02:48
поделиться

Вы хотите сделать один-единственный экземпляр (называемый «специализацией» в общих терминах) этого шаблона другом. Вы делаете это следующим образом

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...
46
ответ дан 28 November 2019 в 02:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: