2011-06-25 18 views
6

Merak ediyorum. Bir problemi çarptım ve işte küçük bir repod. Esasen her şeyi iletmek istiyorum. Sorun, ilk < < kullanarak o<<1 (veya o<<SomeUserStruct() ile bir hataya neden olur. I ikinci içeriyorsa ben bu konuda belirsiz olan hataları alırsınız. Bu kodu yazabilirim bir yolu var, bu yüzden aksi takdirde T& kullanacaktır kullanan T?Tüm sınıfı bir operatörle iletme

#include <iostream> 
struct FowardIt{ 
    template<typename T> FowardIt& operator<<(T&t) { std::cout<<t; return *this; } 
    //template<typename T> FowardIt& operator<<(T t) { std::cout<<t; return *this; } 
}; 

struct SomeUserStruct{}; 

int main() { 
    FowardIt o; 
    o << "Hello"; 
    int i=1; 
    o << i; 
    o << 1; 
    o << SomeUserStruct(); 
} 

cevap

10
template<typename T> FowardIt& operator<<(const T&t) 
             //^^^^^ put const here 

geçicileri const olmayan referansa bağlı olamaz çünkü. yukarıda gösterildiği gibi parametre const başvurusu. Sen sadece parametresini const olun. başka bir işlevi tanımlamak gerekmez olun Sorun çözülecektir

siz fonksiyonun en sağdaki tarafına const koyarak yanı işlev şablonu const yaparsanız Ayrıca daha iyi olurdu: Bunu yaparsanız

template<typename T> 
const FowardIt& operator<<(const T&t) const 
^^^^^      ^^^^^  ^^^^^ 
    |       |   | 
    |       |   put const here as well 
    |       put const here 
    | 
    You've to make the return-type also const 
    since it can't return non-const reference anymore 

, o zaman const nesneler üzerinde bu işlevi çağırabilir ayrıca:

void f(const FowardIt &o)//note: inside the function, o is an const object! 
{ 
    o << 1; 
    o << SomeUserStruct(); 
} 
+0

Mükemmel cevap. Ancak yöntem yapısını yaparsam, dönüş yapısını da yapmalıyım. Hangi mantıksız olurdu (düzenli akışlar için). –

+0

@ acidzombie24: Evet. Bunu da ekledim! – Nawaz

+0

Bu sorunun ne olduğu hakkında bir fikrin var mı? http://www.ideone.com/fWVG4 hex çalışır, bu yüzden fonksiyonların ilerlediğini biliyoruz. Ancak endl değil. –