2011-03-27 3 views
2
//more code omitted that is not relevant, the IF template is not completely shown here 

template <bool condition, typename ThenType, typename ElseType> 
    struct IF { 
     typedef typename ChooseSelector<condition>::RETURN Selector; 
    }; 

    template <bool condition> 
     struct ChooseSelector { 
      typedef SelectThen RETURN; 
     }; 

    template <> 
     struct ChooseSelector<false> { 
      typedef SelectElse RETURN; 
     }; 
//SelectElse and SelectThen omitted 

나는 Expected nested-name-specifier before ‘ChooseSelector’이됩니다. 자주 연결되는 C++ typename description에 따르면 올바르게 입력하면 여기에 typename이 필요합니다. IF 템플릿에서 typename을 제거하면 동일한 오류가 발생하므로 실제로 오류의 원인을 다소 혼란 스럽습니다. typename을 제거하면 문제가 해결된다는 많은 답변을 읽었지만,이 경우에는 그렇지 않습니다. 내가 뭘 놓치고 있니?typename과 오류가있어서

Linux에서 g ++에서 오류가 발생하고 VS10에서 오류가 발생합니다.

+1

ChooseSelector 템플릿 뒤에 IF 템플릿을 넣으십시오. – Erik

+0

흠. 그 생각을하지 않았습니까. 당신이 대답으로 올리면 나는 그것을 받아 들일 것이다. 왜이게 관련이 있는지 말해 줄 수 있어요? – DrColossos

답변

2

ChooseSelector 템플릿 뒤에 IF 템플릿을 넣으십시오.

IF 템플릿을 컴파일 할 때 ChooseSelector가 템플릿으로 존재해야하며 ChooseSelector<condition>이 먼저 구문 분석됩니다. typename은 전문화가 알려질 때 인스턴스화시 완전히 평가되는 RETURN이 첫 번째 통과의 유형으로 간주되어야 함을 컴파일러에 알리는 데 필요합니다.

관련 문제