2010-01-06 5 views
2

오늘 사무실에서 이상한 컴파일 오류가 발생하여 GCC (3.4.6) 버전의 버그 인 것으로 의심됩니다. 나는 몇 줄의 코드 (아래)로 그것을 끓일 수 있었다. 내가받을 컴파일 오류는 다음과 같습니다GCC의 템플릿 함수 관련 버그 3.4.6

test.cpp:26: error: expected primary-expression before '>' token 
test.cpp:26: error: expected primary-expression before ')' token 

이 오류는 첫 번째 문 (bar.value("yoyo"))의 결과를 저장하는 임시 변수를 도입하여 피할 수 있습니다. 아무도이 원인을 알 수 있습니까? GCC 3.4.6의 버그입니까 (GCC 4.x.x에서 작동하는 것 같습니다). 그리고이 버전에도 비슷한 템플릿 관련 버그가 있습니까?

class Foo 
{ 
public: 
    template<typename T> bool doIt() const { return true; } 
}; 

class Bar 
{ 
public: 
    Foo value(const char * key) 
    { 
    return Foo(); 
    } 
}; 

template<typename T> 
void 
mytestfunc() 
{ 
    Bar bar; 
    // Works fine: 
    Foo foo = bar.value("yoyo"); 
    foo.doIt<T>(); 

    // Does not work on gcc 3.4.6: 
    bar.value("yoyo").doIt<T>(); 
} 

int main(int argc, char * args[]) 
{ 
    return 0; 
} 

답변

4

대신을 시도해보십시오

bar.value("yoyo").template doIt<T>(); 

는 최대한 멀리 볼 수있는, 문제는 가끔 typename를 가지는 형태를 앞에해야하는 것과 비슷 따라 이름과 함께입니다.

위의 코드는 doIt이 템플릿 멤버 메서드이고 'less'연산자를 사용하여 비교되는 멤버 변수 doIt이 아니라는 것을 컴파일러에 지정합니다.

+0

설명을위한 Thx가 작동합니다. 아무리 예쁜 구문이 아니더라도 ... – larsmoa

+0

진실은이 경우 이름이 종속되지 않으며'template' 키워드가 필요하지 않다는 것입니다. 컴파일러의 버그처럼 보입니다. 한 예로, Comeau는 그대로 컴파일합니다. – AnT

1

컴파일러는 이전 두 명령문에서 "foo"와 정확히 똑같이 작동하는 마지막 명령문에서 임시 명령을 작성해야합니다. 그래서 네, 버그라고 생각합니다. 특히 GCC 4에서 작동하기 때문에 그렇습니다. 다른 한편으로는 꽤 특이한 코드이기 때문에 실제로 너무 자주 나타나지 않을 수 있습니다. 일반적으로 3.4가 독창적 인 컴파일러와 비교할 때 상당히 견고한 템플릿 기반이라는 것을 알았습니다.