2016-04-26 5 views
0

私はこの作業を取得しようとしていますが、それはエラーメッセージ基本的にC++のostream

C2473 " operator << looks like a function definition but there is no parameter list." 

を思い付くをオーバーロードするためのテンプレートを持っているヘッダを作成するには、これはヘッダファイルであると私はしたいですクラスのネームスペースとテンプレートを宣言して、< <演算子をオーバーライドします。

助けてください! (また、私はStackOverflowのために新たなんだ、これが私の最初の質問です):)

#ifndef header 
#define header 

namespace nmsp{ 
    template <class T> 
    class expt; //forward declaration of class, so friend function can be defined as a template 
    template <class T> 
    std::ostream& operator << (std::ostream& os, const expt <T> &input); 


template <class T> 
class expt { 


    friend std::ostream& operator << (std::ostream& os, const expt <T>& input); 

private: 
    T *data; 
public: 
    expt() { data = null; } 

}; 

template <class T> 
std::ostream& nmsp:: operator << (std::ostream& os, const expt <class T>& input) { 
    //.... 
} 
} 
} 
#endif 
+0

は[MCVEを投稿してください]と次の逐語的なエラーメッセージ。 –

答えて

0

ここにあなたの固定コード(コメントを参照してください)です。

namespace nmsp{ 
    template <class T> 
    class expt; // forward declaration of class, so friend function can be 
       // defined as a template 
    template <class T> 
    std::ostream& operator << (std::ostream& os, const expt <T> &input); 


template <class T> 
class expt { 

    // templated friend declarations don't inherit the outer 
    // class template parameters, you need to make them a template separately 
    template <class U> 
    friend std::ostream& operator << (std::ostream& os, const expt <U>& input); 

private: 
    T *data; 
public: 
    expt() { data = nullptr; } 
       // ^^^^^^^ null isn't a thing 

}; 

} 

// Move the definition out of the namespace 
template <class T> 
std::ostream& nmsp:: operator << (std::ostream& os, const expt <T>& input) { 
                  // ^^^ drop class 
    //.... 
    return os; 
} 
// Remove the extra } 

Live Demo

+0

超高速応答に感謝しますが、まだエラーが発生しています。 オペレータ<<の定義にクラスを落としましたが、エラーメッセージは "nmsp :: expt"です: "T"はパラメータTのテンプレートタイプ引数として有効ではありません.... – AliS

+0

@AliS実際に私のデモのコードを出発点として?最も重要なことは、 'expt'の' friend'関数の最初の再宣言です。 –

+0

申し訳ありません私はあなたが私のコードを稼働させようとしていて、かなりストレスがあるということを意味しているのか分かりませんでした。あなたはあなたのコメントで "テンプレートの友人宣言は、外部クラスのテンプレートパラメータを継承していない、あなたはそれらを別々にテンプレートにする必要があります"という意味について何かを説明することができますか?私の元のコードでは、初めて演算子を記述したときに問題があるようです。 (「オペレータ」という言葉は他の人と同じように点灯しませんでした) – AliS

関連する問題