2013-03-21 3 views
4

다음 코드를 C++ 98/03에서 컴파일해야합니까?기본 클래스의 함수 템플릿을 멤버 함수 포인터에 할당 할 수 있어야합니다

struct Base 
{ 
    template <typename T> void func() { } 
    void norm() { } 
}; 

struct Derived : public Base { }; 

template <typename U> 
struct Usage 
{ 
    typedef void (U::*Method)(); 

    Usage(Method test) { } 
}; 

int main() 
{ 
    Usage<Derived> good(&Derived::norm); 

    // "Error: Cannot use void(*)() to initialize Usage<Derived>." on next line 
    Usage<Derived> bad(&Derived::func<int>); 

    return 0; 
} 

이 코드 조각은 내가 시험해 볼 수있는 거의 모든 컴파일러에서 올바르게 작동합니다. Sun C++ 5.11 및 Sun C++ 5.12를 저장하십시오.

버그일까요? 그렇다면 현재 공급 업체 (현재 Oracle)에게보고되었는지 누구에게 알 수 있습니까?

편집 :

내가 중 하나를 C++ 03 또는 C++ 11 표준 문서에서 적절한 관련 견적을 제공하는 답변을 받아 들일 수 있습니다. 또는 Oracle에 버그 보고서에 대한 정보를 제공 할 수있는 경우.

+6

코드가 좋습니다. Sun C++은 악명 높지 * 않습니다. –

+0

'func'가'T' 타입을 전혀 사용하지 않기 때문에,'Base :: norm'처럼 항상 void (Base :: *) (void)'가됩니다. –

+0

@DrewDormann - 네, 아시다시피, 불행히도. 그들의 표준 라이브러리 구현은 전형적으로 잘 보입니다. –

답변

0

방금 ​​C++ 98 표준 14 장의 대부분을 읽었습니다. 어떤 유형이 결과적으로 (특수한) 템플리트 멤버인지에 대해 실제로는별로 알려지지 않았기 때문에 템플릿 메소드라는 아이디어를 따르고 있다고 가정합니다 그것을 방법의 더 적은을 만들지 않는다. 나는 잠시, C++ 11이 그것에 대해 더 많이 말한다면 나는 볼 것이다.

C++에 관한 나의 일반적인 생각에서 나는 당신의 코드가 통과해야한다는 것을 알고있다. 그리고 그것에 동의하는 대다수의 컴파일러는 또한 단서 일 뿐이 아닌가? :)