2012-01-09 4 views
1

問題の説明はとても簡単です...テンプレートクラス(私が好む)とアプリケーションのために必要な列挙型がありますコンソールからの読み取り:演算子>> for enum for templateクラス

これは、Microsoft C/C++最適化コンパイラが動作しなくなるVisual Studioで問題を引き起こします。言い換えれば:「内部エラーがコンパイラで発生した」エラーを再現し

例コード:

#include <iostream> 
#include <stdexcept> 

template <typename T> 
struct S{ 
    enum X { X_A, X_B, X_C }; 
    template <typename U> 
    friend std::istream& operator>>(std::istream& in, enum S<U>::X& x); 
}; 

template <typename U> 
std::istream& operator>>(std::istream& in, enum S<U>::X& x) 
{ 
    int a; 
    in >> a; 
    x = S::X(a); 
    return in; 
} 

int main() 
{ 
    S<int> s; 
    S<int>::X x = S<int>::X_A; 
    std::cout << "Input: "; 
    std::cin >> x; 
    std::cout << "Output: " << x << std::endl; 
} 

この問題を解決して任意の助けもいただければ幸いです! 私自身はあなたがx = S<U>::X(a)x = S::X(a);を変更する必要が

+0

'enum'は、パラメータリストに必要な、おそらく'型名は S :: X&は 'より良い仕事とされていません。 –

+0

これは重大ではありませんか? – visitor

+0

'typename'はコンパイラをクラッシュから守っていましたが、' std :: cin >> x'を含む行に_no演算子が見つかりましたという不満があります。 – Stonegoat

答えて

0

これが動作しているようだ:

#include <iostream> 

    template< typename T > 
    struct S 
    { 
     enum X 
     { 
     X_A, X_B, X_C 
     }; 

     friend std::istream& operator>>(std::istream& in, typename S<T>::X & x) 
     { 
     int a; 
     in >> a; 
     x = S<T>::X(a); 

     return in; 
     } 
    }; 

    int main(void) 
    { 
    S<int> s; 
    S<int>::X x = S<int>::X_A; 
    std::cout << "Input: "; 
    std::cin >> x; 
    std::cout << "Output: " << x << std::endl;  
    return(0); 
    } 
+0

ありがとうございます! :)構文が奇妙に思えますが、私はそれが好きです;) – Stonegoat

+0

あなたはあなたのオペレータの中で実際に何らかのエラーチェックをする必要があると思います... –

+0

@KerrekSB私は構文問題ではなく実装を手伝っていました。 – lapk

0

test.cpp: In function ‘std::istream& operator>>(std::istream&, enum S::X&)’:
test.cpp:16: error: ‘template struct S’ used without template parameters

...クラスがテンプレート化されているため、列挙型は何とか複数回定義された状態になることを推測します。

+0

お返事ありがとうございます。あなたは正しいです しかし、残念ながらそれはコンパイラがクラッシュするのを防ぎません – Stonegoat

関連する問題