带有流运算符重载的模板类

时间:2017-04-20 17:06:34

标签: c++ templates operator-overloading friend

我正在努力更好地了解C ++的一些高级员工。我现在正在尝试理解stream operator overloadingfriend functiontemplate。我试图在一个代码段中学习所有这些东西。

所以,我正在尝试实现一个只包含template class的{​​{1}},我想用array填充它。所以,我想出了这个。

stream operator

这是非常简单的代码段。但是,我在编译时遇到以下错误

#include <iostream>
using namespace std;

template<class T, int L>
class TestClass
{
    private:
        T data[L];
    public:
        friend void operator>>(const istream&, const TestClass<T,L>&);
};

template<class T, int L>
void operator>>(const istream& in, const TestClass<T,L>& q)
{
    for(int i = 0; i < L; i++)
    {
        in >> q.data[i];
    }
}

int main() {
    TestClass<float, 3> Q;
    cin >> Q;

    return 0;
}

带有以下警告

undefined reference to `operator>>(std::istream const&, TestClass<float, 3> const&)'

我知道,我正在做一些新手的错误,因为我对这件事情很陌生。如果有人帮助成功运行它将会很棒。

1 个答案:

答案 0 :(得分:2)

问题是双重的:

  1. 您的friend功能也应该是模板
  2. 您正在传递istreamTestClass作为常量。删除
  3. 这是更新的代码:

    template<class T, int L>
    class TestClass
    {
        private:
            T data[L];
        public:
            template<class U, int M>
            friend void operator>>(istream&, TestClass<U,M>&);
    };
    
    template<class T, int L>
    void operator>>(istream& in, TestClass<T,L>& q)
    {
        for(int i = 0; i < L; i++)
        {
            in >> q.data[i];
        }
    }
    

    Demo

    编辑:其他同样有效的方法

    声明朋友的语法略有不同,一切都会有效Demo

    template<class T, int L>
    class TestClass
    {
        private:
            T data[L];
        public:
            friend void operator>> <>(istream&, TestClass&);
    };
    

    (谢谢@chris)。此格式(使用<>)与上述示例的不同之处在于,上述技术上将operator>>所有实例化声明为friend而仅此一个有一对一的关系。

    或者,您可以将定义与朋友声明Demo一起包括在内:

    template<class T, int L>
    class TestClass
    {
        private:
            T data[L];
        public:
            friend void operator>>(istream& in, TestClass& q){
                for(int i = 0; i < L; i++)
                {
                    in >> q.data[i];
                }       
            }
    };