2010-06-04 8 views
5

오늘 내 친구 중 하나는 다음과 같은 코드가 자신의 비주얼 스튜디오 2008에서 잘 컴파일 말해 줬어 :Visual C++ 컴파일러는 dependent-name을 "typename"없이 유형으로 허용합니까?

#include <vector> 
struct A 
{ 
    static int const const_iterator = 100; 
}; 
int i; 
template <typename T> 
void PrintAll(const T & obj) 
{ 
    T::const_iterator *i; 
} 
int main() 
{ 
    std::vector<int> v; 
    A a; 
    PrintAll(a); 
    PrintAll(v); 
    return 0; 
} 

나는 보통 g ++ 사용하고, 항상 두 번째의 printAll() 호출을 전달하는 데 거부한다. 아시다시피,이 문제에 대해 g ++은 템플릿을 번역하는 표준 방법을 사용하고 있습니다.

내 지식이 잘못 되었습니까, 아니면 VS2008의 확장인가요?

+0

/Za (엄격) 또는/Ze (기본값, 내선)를 사용합니까? – MSalters

+0

@MSalters : 지금/Za와 시도했습니다. 차이점을 보지 못했습니다 ... – hpsMouse

답변

8

이것은 확장자가 아닙니다. 템플릿을 구문 분석하고 인스턴스의 시점에서 모든 비에 의존하는 이름을

  • 을 결정, 템플릿이 유효한 생산 확인, 정의의 시점에서

    1. :

      VC++ 제대로 두 단계의 해석을 구현하지 코드

    VC++는 첫 번째 단계를 구현하지 않았습니다. 이는 비 호환 코드를 받아들이는 것뿐만 아니라 일부 상황에서 완전히 다른 코드를 생성한다는 것을 의미하기 때문에 불편합니다. 이 T에 의존하지 않는 템플릿의 정의와 foo의 해상도의 지점에서 사용할 수있는 유일한 정의이기 때문에

    • 준수 컴파일러는 "INT"를 출력 할 것이다 :이 코드

      void foo(int) { std::cout << "int" << std::endl; } 
      
      template <class T> void tfoo() { foo(2.0); } 
      
      void foo(double) { std::cout << "double" << std::endl; } 
      
      int main(int argc, char* argv[]) 
      { 
          tfoo<Dummy>(); 
      } 
      

      .

    • VC++는 그것은 어리석은까지 차이가 ​​가서 보일 수 1

    상 귀찮게하지 않기 때문에, "더블"인쇄,하지만 당신은 숫자에 대해 생각하는 경우가 큰 프로그램이 포함의 것 BAM :/

  • +0

    "VC++"에게 최소한 경고를 발생시킬 수있는 방법은 없나요? 이 동작은 여러 컴파일러에서 작동해야하는 코드의 성가신 문제입니다. 우리 팀의 개발자는 매번 키워드를 추가하는 것을 잊어 버리며 코드는'Clang'에서 컴파일하지 못합니다. – Samaursa

    +1

    @Samaursa : 불행히도, 제가 아는 것은 아닙니다. Clang을 사용하고 있다면, Visual Studio에서 Clang을 직접 호출 할 수 있도록 VC++ 용 드롭 인 드라이버를 개발 중임을 알면 흥미로울 것입니다. –

    1

    "확장명"이 정확하게 VC++를 설명하는 방법은 확실하지 않지만 그렇다고해서 gcc가이 점에 관해 더 잘 부합됩니다.

    +0

    허용 모드에서의 Visual Studio의 동작입니까? 엄격한 모드에서 코드를 거부하고 VC6과의 하위 호환성을 위해이 확장을 구현한다고 생각합니다. – MSalters

    +0

    @MSalter : 아니요, VC++는/Za를 사용하여 코드를 받아들입니다. –