在模板类中调用重载的istream运算符时出错

时间:2014-01-18 21:06:16

标签: c++

我想重载“>>”模板类中的运算符,但是当我尝试将某些内容写入向量时,我遇到了一些错误。 这是我的Vector函数的一部分:

#include <iostream>

template<typename T>
class Vector
{
public:
  T operator[](const int& i);

  template <T> friend 
  std::ostream& operator<<(std::ostream& out, const Vector &v);

  template <T> friend 
  std::istream& operator>>(std::istream& in, Vector<T> &v);
};


template<typename T> 
std::istream& operator>>(std::istream& in, Vector<T> &v) {
  for(int i =0; i < v.getSize(); i++) {
    in >> v[i];
  }
}

我用这个测试写入了一个向量:

int main {
     Vector<int> v1(5);
     cin >> v1;
}

这是错误:

Vector.h: In function ‘std::istream& operator>>(std::istream&, Vector<T>&) [with T = int, std::istream = std::basic_istream<char>]’:
testVector.cpp:9:9:   instantiated from here
Vector.h:94:3: error: ambiguous overload for ‘operator>>’ in ‘in >> (& v)->Vector<T>::operator[] [with T = int]((*(const int*)(& i)))’
Vector.h:94:3: note: candidates are:
/usr/include/c++/4.6/istream:122:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__istream_type& (*)(std::basic_istream<_CharT, _Traits>::__istream_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT,

这是我的代码的一部分。如果我在测试函数中只使用这样的东西,它会编译:

Vector<int> v1.
cout << v1.getSize();

更新: 我修改了&gt;&gt;运算符重载定义如下:

template<typename T> std::istream& operator>>(std::istream& in, Vector<T> &v) {
    T tmp;
    for(int i =0; i < v.getSize(); i++) {
        in >> tmp;
        v[i] = tmp;
    }
}

这是operator []的定义:

template<typename T> T Vector<T>::operator[](const int& i) {
    return elements[i];
}

我收到此错误:

Vector.h:96:3: error: lvalue required as left operand of assignment

我应该如何覆盖&gt;&gt;运营商? 感谢。

2 个答案:

答案 0 :(得分:2)

这些行:

template <T> friend std::ostream& ...
template <T> friend std::istream& ...

模板参数应该是一个类型。正如您所写,它需要一个所述类型的对象

template<typename U> friend std::ostream& ...
template<typename U> friend std::istream& ...

你没有在这里指定模板参数:

Vector v1(5);
      ^

答案 1 :(得分:0)

您的问题与流重载无关:

  1. 您有两个具有相同参数int的构造函数。构造函数的名称并不重要,主要的是类型。因此,两个Vector<T>(int)会给出错误重载错误。

  2. 您没有重载的下标运算符(operator[]),将其设置为修复主要问题

  3. 如提到的0x499602D2,将好友类更改为正确的格式,因为您将收到错误&#34;访问类Vector&#34;的私有成员变量如果你试图使用私人会员。在您的方案中,您正在访问公共成员,因此您甚至可能不需要对流重载进行分析。阅读有关朋友here的信息。那么,问问自己一个问题? &#34;流操作符函数是否会访问Vector类的私有成员?&#34;如果是,请使用朋友;否则将其从班级声明中删除。

  4. 从源代码中删除def。我们知道它来自源文件。

  5. 测试程序无法正常工作,因为您尚未指定正在使用的模板参数。

  6. 编辑:添加了(3)关于友谊的链接