2012-01-09 4 views
1

문제의 설명은 매우 쉽습니다 ... 나는 열거 형 템플릿 클래스 (내가 선호하는) 및 내 응용 프로그램에 대한 필요가 있습니다. 이 열거 형에 대해 연산자 >>() 함수를 정의 할 수 있어야합니다.콘솔에서 읽기 : 연산자 >> 열거 형 템플릿 클래스 내

그러나 Visual Studio에서는 Microsoft C/C++ 최적화 컴파일러가 작동하지 않는 문제가 발생합니다. 즉 :

#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