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

м пытается перегрузить оператор << как друг для шаблона класса Pair, но я получаю предупреждение компилятора, говорящее

friend declaration std::ostream& operator

Ответы на вопрос(3)

Простая встроенная версия:

template<typename t=""> class HasFriend {
    private:
        T item;
    public:
       ~HasFriend() {}
       HasFriend(const T &i) : item(i) {}
    friend ostream& operator<<(ostream& os, const HasFriend<t>& x) {
        return os << "s(" << sizeof(x) << ").op<<" << x.item << endl;
    }
};
</t></typename>

Пересмотренная версия шаблона:

template<template<typename **=""> class U, typename V>
ostream& operator<<(ostream &os, const U<v> &x) {
    return os << "s(" << sizeof(x) << ").op<<" << x.item << endl;
}

template<typename t=""> class HasFriend {
    private:
        T item;
    public:
       ~HasFriend() {}
       HasFriend(const T &i) : item(i) {}
    friend ostream& operator<<<>(ostream&, const HasFriend<t>&);
};
</t></typename></v></template<typename>

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

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></class>

Поскольку компилятор знает из списка параметров, что аргументы шаблона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...
</t,u></class></class>
 Nick13 янв. 2017 г., 00:53
Вау, экстра легко пропустить!
 Andry26 июн. 2012 г., 02:35
Я согласен с Дэвидом; Это лучшее решение с точки зрения лучшей практики и хорошего программирования.
 David Rodríguez - dribeas19 авг. 2009 г., 07:20
+1 На самом деле это то, на что жалуется компилятор. Другой ответ связан с проблемой обходного пути: вместо того, чтобы сообщать компилятору, что другом является специализация шаблона, он создает не шаблонный оператор << функция для данных типов.
Решение Вопроса

< как возвращение ostream &, но в методе нет оператора return. Должно быть:

template <class t,="" class="" u="">
ostream& operator<<(ostream& out, Pair<t,u>& v)
{
    return out << v.val1 << " " << v.val2;
}
</t,u></class>

Кроме этого, у меня нет проблем или предупреждений, компилирующих ваш код в 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;      
}
</int,></t,u></class></iostream>

Ваш ответ на вопрос