c++与运算符 << 的输入混淆和 []
我正在尝试将数组元素的值打印为 cout << array[0]
,(其中数组是使用运算符[]的一些美化类),但 C++ 类型系统似乎令人难以置信地混乱。 GCC 错误是这样的:(
example.cpp:44:20: error: no match for ‘operator<<’ in ‘std::cout << a_0.fixedarr<T, N>::operator[] [with T = int, long unsigned int N = 5ul, size_t = long unsigned int](0ul)’
整个源代码来自更复杂的东西,但我认为我已经将其简化为一个最小的示例)。
#include <assert.h>
#include <cassert>
#include <climits>
#include <cstdio>
#include <iostream>
using namespace std;
template<typename T>
class fixedarrRef{
T* ref;
int sz;
public:
fixedarrRef(T* t, int psz){ ref = t; sz = psz;}
T val(){ return ref[0]; }
};
template<typename T, size_t N>
class fixedarr{
public:
T arr[N];
fixedarr(){
for(int i=0; i<N; ++i){
arr[i] = 0;
}
}
inline fixedarrRef<T> operator[] (const size_t i) const{
assert ( i < N);
return fixedarrRef<T>((T*)&arr[i], N-i);
}
};
template <typename T>
ostream & operator << (ostream &out, fixedarrRef<T> &v)
{
return (out << v.val());
}
int main() {
fixedarr<int, 5> a_0;
fixedarrRef<int> r = a_0[0];
cout << (a_0[0]) << endl;
// cout << r << endl;
return 0;
}
请注意,最后的注释代码有效。提前致谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您应该同时声明
TfixedarrRef::val()
和fixedarrRef;
。运算符 <<
const 中的 &v和
You should declare both
T fixedarrRef::val()
andfixedarrRef<T> &v
inoperator <<
const.and
a_0[0]
返回一个无法绑定到非常量引用的临时对象,因此您的运算符 <<
应将其参数作为常量引用。a_0[0]
returns a temporary object which can not be bound to a non-const reference, Hence youroperator <<
should take its parameter as a const reference.您的
[]
运算符返回fixedarrRef
类的实例,并且您尝试在此实例上使用运算符<<
。由于没有为
fixedarrRef
定义<<
运算符,您将得到错误。定义这个运算符,它应该可以工作。
Your
[]
operator returns an instance of thefixedarrRef
class and you are trying to use the operator<<
on this instance.Since there is no
<<
operator defined forfixedarrRef
you will get and error.Define this operator and it should work.