путаница при вводе c ++ с операторами << и [] - PullRequest
0 голосов
/ 27 июля 2010

Я пытаюсь напечатать значение элемента массива как 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;
}

Обратите внимание, что закомментированный код в конце работает. Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 27 июля 2010

Вы должны указать как T fixedarrRef::val() и fixedarrRef<T> &v в operator << const .

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

и

template <typename T>
ostream & operator << (ostream &out, const fixedarrRef<T> &v)
3 голосов
/ 27 июля 2010

a_0[0] возвращает временный объект, который не может быть привязан к неконстантной ссылке, поэтому ваш operator << должен принимать свой параметр в качестве константной ссылки.

0 голосов
/ 27 июля 2010

Ваш оператор [] возвращает экземпляр класса fixedarrRef, и вы пытаетесь использовать оператор << в этом экземпляре.

Поскольку для fixedarrRef не определен оператор <<, вы получите ошибку.

Определите этот оператор, и он должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...