2016-06-29 4 views
0

다음 코드는 제대로 빌드되지만 오버로드 된 템플릿 연산자는 호출되지 않습니다. 왜 그런가요? main() 함수는 x 대신 120을 인쇄합니다.중첩 형식의 오버로드 연산자

#include <iostream> 

namespace foo 
{ 
    struct bar 
    { 
     enum Type { x = 'x', y = 'y' }; 
    }; 
    template<typename T> std::ostream& operator<<(std::ostream& s, typename T::Type o) { return s << char(o); } 
} 

int main() 
{ 
    foo::bar::Type t{ foo::bar::x }; 
    std::cout << t; 
} 

답변

1

컴파일러는 유형 T이 템플릿을 인스턴스화 (즉에 대한 자세한 내용은 this 질문을 확인)하기 위해 있어야하는데 무엇을 알 수 없을 것입니다. 그냥 이렇게 : bar 그렇게 접근 제한이 경우에 대해 걱정할 필요가 거기 없습니다에

std::ofstream & operator<<(std::ostream & s, bar::Type t){...} 

enum 당신이 선언은 public입니다.

+0

사실 내 코드에 여러 유형의 열거 형이 정의되어 있습니다. 나는 그들 모두에 대해 연산자 <<를 정의하지 않아도되고 싶다. – BlindDriver

+0

@BlindDriver 작동하지 않는 이유를 이해하려면 유형 공제를 읽어야합니다. 코드 중복을 최소화하거나 한 번에 하나씩 작성하는 매크로를 작성해야합니다. – SirGuy

+0

예, 내가 참조한 게시물을 읽고 코드가 작동하지 않는 이유를 확인하십시오. 나는 대안이 있기를 바랄 뿐이었다. 그러나 어쨌든 당신의 도움을 위해 대단히 감사합니다! – BlindDriver