我想重载“>>”模板类中的运算符,但是当我尝试将某些内容写入向量时,我遇到了一些错误。 这是我的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;运营商? 感谢。
答案 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)
您的问题与流重载无关:
您有两个具有相同参数int
的构造函数。构造函数的名称并不重要,主要的是类型。因此,两个Vector<T>(int)
会给出错误重载错误。
您没有重载的下标运算符(operator[]
),将其设置为修复主要问题
如提到的0x499602D2,将好友类更改为正确的格式,因为您将收到错误&#34;访问类Vector&#34;的私有成员变量如果你试图使用私人会员。在您的方案中,您正在访问公共成员,因此您甚至可能不需要对流重载进行分析。阅读有关朋友here的信息。那么,问问自己一个问题? &#34;流操作符函数是否会访问Vector类的私有成员?&#34;如果是,请使用朋友;否则将其从班级声明中删除。
从源代码中删除def
。我们知道它来自源文件。
测试程序无法正常工作,因为您尚未指定正在使用的模板参数。
编辑:添加了(3)关于友谊的链接