2013-02-18 2 views
0

어쨌든 VS에서 누락 된 typename을 식별 할 수 있습니까? VS가 적어도 어떤 종류의 경고를 생성합니까?Visual Studio에서 누락 된 typename을 식별하는 방법

template<class T> 
void dum() { 
    std::vector<T> dum_vector; 
    typename std::vector<T>::iterator it = dum_vector.begin(); 
    // VS compiles it with or without typename, but I would like to know whether 
    // I forgot to put a typename, since without typename the code may not compile 
    // with another compiler (e.g. GCC) 
} 
+2

"typename없이 코드가 다른 컴파일러와 컴파일되지 않을 수 있기 때문에"=> "typename없이 코드가 잘 형성되지 않았기 때문에 C++". – juanchopanza

+0

우리가 말하는 VS의 버전은 무엇입니까? – fredoverflow

+4

@FredOverflow 어떻게 이것이 중복입니까? 이 질문은 키워드가 무엇인지, 어디에 적용되는지를 묻는 것이 아니라 MSVC가 유일성의 왕좌에서 물러나고 비표준 구문을 받아 들일 때 적어도 * 언급 * 할 수있는 방법을 묻습니다. – Angew

답변

1

표준 적합성이 100 %인지 모르겠지만 MSVC는 typename이 명시 적으로 필요한 모든 경우 또는 대부분의 경우에 Compiler Warning (level 1) C4346을 산출합니다. 따라서 컴파일러 플래그 /W1 이상으로 컴파일하는 동안 괜찮습니다.

+0

이상합니다. \ W3을 사용하고 있지만 VS10에서는 경고가 표시되지 않습니다. – user2083875

1

실제로 현재 버전의 C++ (C++ 11)에서는 그다지 쓸 필요가 없습니다. 다음과 같이 쓸 수 있습니다 :

auto it = dum_vector.begin(); 

그리고 끝났습니다.

MSVC10부터 auto이 지원되므로 사용하는 경우 blah::blah::iterator 대신 auto을 사용하는 것이 좋습니다. 이전 버전을 사용하는 경우 가능한 한 C++ 11 기능의 이점을 업그레이드하고 유용하게 사용하는 것이 좋습니다. 그렇게 할 수 없다면 MSVS가 누락 된 typename을 말할 수 있다는 컴파일러가 처음에 비표준 코드를 컴파일한다는 점을 감안할 때 매우 유용 할 것입니다!

+1

감사합니다. C++ 11의 현재 프로젝트에 대해 감사드립니다. 내가 C++ 11 호환 컴파일러로 전환하지 않았다. – user2083875

+0

추가 메모를 보내 주셔서 감사 드리며 또한 이에 동의합니다. 내 질문에 대한 다른 대답이 없으면 (왜 그러한 지원이 제공되지 않는지 설명하려고하므로) 대답을 수락 할 것입니다. – user2083875

관련 문제