2016-05-09 5 views
0

オーバーロードされたistreamおよびostreamを宣言して使用する必要がありますか?これは私のコードです:クラステンプレートにシームレスにオーバーロードする

.hhファイルに:

.ccpファイル内
template <typename TypWart> 
class matrix{ 
    private: 
    bool poprawny; 
    int rozmiar; 
    TypWart *tab; 
    TypWart *wyniki; 
    TypWart *wyrazy; 
    wektor *z; 
public: 
    void alokuj(); 
    void gauss(); 
    TypWart rozwiaz(); 
    void wypisz(); 
    void zamien(int k, int l); 
    void sprawdz(); 
    zespolona& operator[](int x){ 
     return tab[x]; 
    } 
    wektor pomnoz(wektor W, wektor A); 
    wektor odejm(wektor W, wektor A); 
    wektor przypisz(); 
    //matrix skopiuj(matrix M); 
    wektor przypisz2(); 
    // wektor pierwiastek(wektor W); 
    wektor operator*(wektor W); 
    template <typename Typ> 
    friend istream& operator>>(istream& strm, matrix<Typ>& M); 
    template <typename Typ> 
    friend ostream& operator<<(ostream& strm, matrix<Typ>& M); 

    friend ostream& operator<<(ostream& strm, wektor W); 

}; 

template <typename Typ> 
istream& operator>>(istream& strm, matrix<Typ>& M){ 
    int x,y; 
    //strm >> x >> y; 
    for(x=0; x<M.rozmiar; x++){ 
     for(y=0; y<M.rozmiar; y++){ 
      if(!(strm >> M.tab[y+(x*M.rozmiar)])) return strm; 
     } 
    } 
    for(x=0; x<M.rozmiar; x++) if(!(strm >> M.wyniki[x])) return strm; 
    return strm; 
} 

template <typename Typ> 
ostream& operator<<(ostream& strm, matrix<Typ>& M){ 
    int x,y; 
    //strm << x << " " << y << endl; 
    for(x=0; x<M.rozmiar; x++){ 
     for(y=0; y<M.rozmiar; y++){ 
      strm << M.tab[y+(x*M.rozmiar)]; 
      strm << " "; 
     } 
     strm << endl; 
    } 
    return strm; 
} 

そして、私は取得していますエラー:

main.o: In function `main': 
main.cpp:(.text+0x24): undefined reference to `std::basic_istream<char, std::char_traits<char> >& operator>><zespolona>(std::basic_istream<char, std::char_traits<char> >&, matrix<zespolona>&)' 
collect2: ld returned 1 exit status 
make: *** [a.out] Error 1 

私が試しました.hhファイルの宣言に<>を追加しましたが、動作しませんでした。これをどうやって解決するのですか?

+1

不完全で疑問のない質問ですが、私はこれを読んでいると助けになると思います:http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file – user4581301

答えて

0

collect2:ldが1の終了ステータスを返しましたはコンパイラエラーではなくリンカーエラーです。リンカーは、特定の名前で関数を見つけるよう求められましたが、そうしませんでした。

どのような名前が見つかりませんでしたか?知りません;他のあなたの.cppファイルがコンパイルされないだろう - - しかし、何かが間違っているとistream& operator>>(istream& strm, matrix<Typ>& M)用のコードを推測で

std::basic_istream<char, std::char_traits 

、コンパイラ生成(またはだろう)である:あなたの質問は、メッセージを省略しましたコンパイラ/リンカー呼び出しのコマンドライン。

質問を編集してエラーメッセージ全体とそれを生成したコマンドを表示すると、より良い回答が得られる可能性が高くなります。

関連する問題