6

operator<<次のように、クラステンプレートをオーバーロードしようとしています。

template<int V1,int V2>
class Screen
{
    template<int T1,int T2> friend ostream& operator<< (ostream &,Screen<T1,T2>&);  
    private:
        int width;  
        int length;
    public:
        Screen():width(V1),length(V2){}
};
template<int T1,int T2>
ostream& operator<< (ostream &os,Screen<T1,T2> &screen)
{
    os << screen.width << ' ' << screen.length;
    return os;
}

上記のコードはcorrentを実行しています!しかしoperator<<、関数テンプレートとして設定しないことでオーバーロードする方法があるかどうかを知りたいです:

friend ostream& operator<< (ostream &,Screen<T1,T2>&);

4

2 に答える 2

6

はい。ただし、テンプレートを事前に宣言し、<>構文を使用する必要があります。

template<int V1, int V2> class Screen;
template<int T1, int T2> ostream &operator<< (ostream &,Screen<T1,T2> &);
template<int V1, int V2>
class Screen
{
    friend ostream& operator<< <>(ostream &, Screen&);
    ...
于 2012-12-18T11:41:09.410 に答える
5

良い習慣は、printContentこのようないくつかの公的な機能を持つことです-

void Screen::printContent(ostream &os)
{
    os << width << ' ' << length;
}

ostream& operator<< (ostream &os,Screen<T1,T2> &screen)
{
    screen.printContent(os);
    return os;
}

friendしたがって、 sは必要ありません

于 2012-12-18T11:44:50.053 に答える