2013-02-09 2 views
3

작동하지 않는 일반 조회 및 종속 함수 호출 내가 믿을 C에 따라 일을해야되게 간단한 코드 ++ 표준 입니다 :ADL, 여기 OO

:

template<typename T> 
void foo(T x) 
{ 
    bar(x); 
    void bar(int); 
} 

void bar(int) { } 

int main() 
{ 
    foo(0); 
} 

오류가 온다 GCC 4.7로

는 '줄'이 범위에서 선언되지 않은, 어떤 선언은 인스턴스의 시점에서 인수 종속적 조회에 의해 를 찾을 수 없습니다

그러나 C++ 표준에서는 작성되었습니다. § 14.6.4.2 : 템플릿 매개 변수에 의존하는 함수 호출에 대한

는 후보 함수는 것을 제외하고, 일반적인 규칙 룩업 (3.4.1 3.4.2, 3.4.3)를 사용하여 발견된다 :

은 - 규정되지 않은 이름 조회 (3.4.1) 또는 공인 이름 조회 (3.4.3)를 사용하여 검색의 일부를 들어, 템플릿 정의 컨텍스트 만 함수 선언이 발견된다.

내가 쓴 무슨 잘못된 인상을 가지고있다 할 수있다

는, 사람이 나를 여기에 수정하시기 바랍니다 수 있습니까?

답변

0

'bar'선언을 맨 위로 이동해야합니다. 템플리트가 정의 된 (인스턴스화되지 않은) 지점에서 'bar'가 호출되기 전에 선언되지 않았기 때문입니다.

+0

나는 그것을 할 수 있었고 효과가있었습니다. 그런데 왜 작동하지 않습니까? 그 인스턴스의 시점에서 그것은 종속 호출 이후 해결되었을 것입니다. – M3taSpl0it

+0

글쎄, 당신의 표준 스 니펫을 읽었을 때, 나는 그것이 내가 말한 것과 충돌하지 않을 것이거나, GCC가 당신의 코드를 거부했다고 생각하지 않습니다. 나는 당신이 제시 한 것이 적절한 C++가 아니라고 생각합니다. –

+0

그래서 인스턴스화 시점에서 종속 호출에 대해 일반 조회가 수행되지 않는다는 의미입니까? – M3taSpl0it