2011-06-25 14 views
6

私は不思議です。私は問題にぶつかりました、そして、ここでは小さな再改造です。本質的に私はすべてを転送したい。問題は、最初に< <を使用するとエラーが発生し、o<<1(またはo<<SomeUserStruct())です。2番目のコードを含めると、あいまいなエラーが表示されます。このコードを書くことができるので、T&Tを使用しています?オペレータでクラス全体を転送する

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

答えて

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

上記のように一時は非const参照にバインドすることはできませんので。、パラメータconst参照してください。あなたが別の関数を定義する必要はありません。ただ、パラメータconstを行い、問題は解決されます。

あなたのように、関数の一番右側にconstを置くことによって、同様の機能テンプレートconstを作る場合、それはまた、より良いでしょう:あなたがそうするならば、あなたはconstオブジェクトに対してこの関数を呼び出すことができます

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 

同様に:

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

優れた答え。しかし、私はメソッドのconstを作る場合は、同様にリターンconstを作る必要があります。それは非論理的なものです(通常のストリームの場合)。 –

+0

@ acidzombie24:はい。私もこれを追加しました! – Nawaz

+0

あなたはこれに関する問題が何であるか考えていますか? http://www.ideone.com/fWVG4 16進数が機能するので、機能が進んでいることが分かります。しかし、endl isnt。 –

関連する問題