2014-12-17 5 views
1

중첩 클래스 Outer의 생성자에 멤버 함수 Outer<T>::foo에 대한 포인터를 전달하는 데 어려움이 있습니다 (ideone 참조).외부 클래스 템플릿의 멤버 func에 대한 포인터를 중첩 클래스에 전달

template<typename T1> 
struct Outer 
{ 
    void foo() 
    { 
    } 

    Outer() : inner(&Outer::foo) // ERROR: compiles without &Outer::foo and Inner(F f), below 
    { 
    } 

    template<typename T2, void (T2::*F)()> 
    struct Inner 
    { 
     Inner(F f) // ERROR 
     { 
     } 
    }; 

    Inner<Outer,&Outer::foo> inner; 
}; 

int main() 
{ 
    Outer<int> outer; 
} 

내가 뭘 잘못하고 있니? 이것이 가능한지 궁금해지기 시작했습니다.

+1

'F'는 형식이 아닙니다, 그것은 함수 포인터입니다. 객체가 무엇인지 이미 아는 경우 매개 변수를 전달하는 이유는 무엇입니까? – 0x499602D2

+0

미안하지만 중첩 클래스가 표시되지 않습니다 ... –

+0

@Bot Huh? 'Outer :: Inner'는 중첩 된 템플릿 유형입니다. – cdhowie

답변

5

문제는 변수와 템플릿 인수가 충돌하는 것입니다. 상수 포인터를 템플릿 인수로 사용하거나 변수 포인터를 함수의 인수로 전달할 수 있습니다.

template<typename T1> 
struct Outer 
{ 
    void foo() 
    { 
    } 

    Outer() : inner(&Outer::foo) 
    { 
    } 

    template<typename T2> 
    struct Inner 
    { 
     // Takes a pointer at runtime to any matching signature in T2 
     Inner(void (T2::*f)()) 
     { 
     } 
    }; 

    Inner<Outer> inner; 
}; 

int main() 
{ 
    Outer<int> outer; 
} 

Live

또는이 작동 :

이 작동

template<typename T1> 
struct Outer 
{ 
    void foo() 
    { 
    } 

    Outer() : inner() 
    { 
    } 

    // Takes a pointer at compile time to a matching function in T2 
    template<typename T2, void (T2::*f)()> 
    struct Inner 
    { 
     Inner() 
     { 
     } 
    }; 

    Inner<Outer,&Outer::foo> inner; 
}; 

int main() 
{ 
    Outer<int> outer; 
} 

Live

+0

대규모 감사합니다. 여기에 솔루션 버전 인 http://ideone.com/LyYZKG가 있습니다. 이상하게도 개인적으로, 내부에서'Outer :: foo()'를 부를 수 있습니다. 표준이 이것을 허용합니까? BTW, MSVC 2013 및 GCC 4.8.3에서 테스트했습니다. – Olumide

+1

실제로 포인터를 전달하는 것은 '외부'이기 때문에 합법적입니다. 기본적으로, 모든 클래스에 대한 권한을 가진 Outer 클래스는 포인터를 다른 사용자에게 전달하려고 선택합니다. 클래스 밖에서는 포인터 일 뿐이며 public/private은 체크되지 않습니다. 'Inner'가'Out:: foo()'에 직접 접근하려고하면, 거부 될 것입니다. –

+0

재미있는 제이. 외부의 비공개 멤버에 대한 참조를 전달하는 것과 매우 비슷합니다. 내 다음 질문보기 http://stackoverflow.com/questions/27537482/able-to-use-pointer-to-function-to-call-private-method-of-an-external-class – Olumide

관련 문제