2010-07-27 11 views
0

Je suis en train d'imprimer une valeur d'un élément de tableau comme cout << array[0], (où le tableau est une classe glorifiée utilisant l'opérateur []), mais le système en tapant C++ semble incroyablement confus. L'erreur GCC est la suivante:C++ taper la confusion avec les opérateurs << et []

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)’ 

(La source entière provient de quelque chose de plus compliqué, mais je pense que je l'ai Pared vers le bas à un exemple minimal).

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

Notez que le code commenté à la fin fonctionne. Merci d'avance.

Répondre

3

Vous devriez déclarer à la fois T fixedarrRef::val() et fixedarrRef<T> &v dans operator <<const.

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

et

template <typename T> 
ostream & operator << (ostream &out, const fixedarrRef<T> &v) 
+0

impressionnant, quelle douleur [avec C++, pas vous, merci pour la réponse] :) – gatoatigrado

+0

Vous pouvez lire la raison réelle ** pourquoi ** vous devriez le faire dans la réponse de Naveen ci-dessous. –

0

Votre opérateur [] renvoie une instance de la classe fixedarrRef et que vous essayez d'utiliser l'opérateur << sur cette instance.

Puisqu'il n'y a aucun opérateur << défini pour fixedarrRef vous obtiendrez et erreur.

Définissez cet opérateur et cela devrait fonctionner.

+1

Il y a ** un opérateur 'fixedarrRef'' '' défini. –

+0

J'ai remarqué le << opérateur après :((oublié de faire défiler le code :() – Ando

3

a_0[0] retourne un objet temporaire qui ne peut pas être lié à une référence non-const, où votre operator << devrait prendre son paramètre comme référence const.