繁体   English   中英

重载friend operator <<为模板类

[英]Overloading friend operator << for template class

我正在尝试重载运算符<<作为模板类对的朋友,但我不断收到编译器警告说

friend declaration std::ostream& operator<<(ostream& out, Pair<T,U>& v) declares a non template function

对于此代码:

friend ostream& operator<<(ostream&, Pair<T,U>&);

作为推荐说,它给出了第二个警告

if this is not what you intended, make sure the function template has already been declared and add <> after the function name here

这是函数定义

template <class T, class U>
ostream& operator<<(ostream& out, Pair<T,U>& v)
{
    out << v.val1 << " " << v.val2;
}

这是整个班级。

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;
};

我不知道从推荐警告中得到什么,除此之外我可能必须在朋友声明中放置一些内容。 有谁知道这个的正确语法? 谢谢。

您希望将该模板的一个实例(在通用术语中称为“专业化”)作为朋友。 你这样做的方式如下

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;
};

因为编译器从参数列表中知道模板参数是TU ,所以您不必将它们放在<...>之间,因此可以将它们留空。 请注意,您必须在Pair模板上方放置operator<<的声明,如下所示:

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...

您将operator <<声明为返回ostream&,但该方法中根本没有return语句。 应该:

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<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;
    }
};

修订模板版本:

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>&);
};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM