代码之家  ›  专栏  ›  技术社区  ›  gatoatigrado

c++输入与运算符<<和[]混淆

  •  0
  • gatoatigrado  · 技术社区  · 14 年前

    我试图将数组元素的值打印为 cout << array[0]

    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;
    }
    

    请注意,最后的注释代码是有效的。提前谢谢。

    3 回复  |  直到 14 年前
        1
  •  3
  •   Didier Trosset    14 年前

    你应该两个都申报 T fixedarrRef::val() fixedarrRef<T> &v operator << .

    T val() const { return ref[0]; }
    

    template <typename T>
    ostream & operator << (ostream &out, const fixedarrRef<T> &v)
    
        2
  •  3
  •   Naveen    14 年前

    a_0[0] 返回不能绑定到非常量引用的临时对象,因此 operator <<

        3
  •  0
  •   Ando SylviA    14 年前

    你的 [] 运算符返回 fixedarrRef << 在这种情况下。

    既然没有 << 固定参考 你会得到和错误。

    定义这个操作符,它应该可以工作。