2012-06-24 5 views
3

foo1에 템플릿 매개 변수로 포인터를 가져 오려고합니다. 다음은 코드입니다.템플릿에서 포인터로 템플릿 매개 변수 공제

struct baz{ 
    int qux; 
}; 

template<typename C, typename T, T C::*m> 
struct foo1{}; 

template<typename C, typename T> 
void barr2(T C::*m){ 
} 

template<typename C, typename T> 
void barr1(T C::*m){ 
    barr2(m); // ok 
    foo1<C, T, &baz::qux> _; // ok 
    foo1<C, T, m> f; // g++4.6.1 error here; how to pass 'm' correctly ? 
} 

int main(){ 
    barr1(&baz::qux); 
} 

그래서 어떻게 생겼습니까?

+1

도 참조 [내 관련 질문 (HTTP : //stackoverflow.com/questions/9729438/c-pointer-to-method-template-deduction-doesnt-compile-when-targeting-x86-but). 짧은 대답은 내가 아는 한 당신이 할 수 없다는 것이지만, GCC 나 VC++ x64를 목표로하고 싶다면 작동 할 것입니다. 잠깐, 신경 쓰지 마세요, 메소드 포인터가 아니라 데이터 멤버 포인터입니다. 내가 뭐라 했어도 잊어 버려! – Cameron

답변

7

컴파일 타임 식에서 런타임 정보를 사용하려고하기 때문에 사용할 수 없습니다. 템플릿을 전문화하기 위해 콘솔에서 읽는 정수를 사용하는 것과 같습니다. 그것은 작동하기위한 것이 아닙니다.

그것은 반드시 문제가 해결되지 않지만, barr1 기능의 의도가 입력 부담을 완화하는 경우,이 같은 당신을 위해 작동 할 수 있습니다

struct baz{ 
    int qux; 
}; 

template<typename C, typename T, T C::*m> 
struct foo1 {}; 

#define FOO(Class, Member)         \ 
    foo1<Class, decltype(Class::Member), &Class::Member> 

int main(){ 
    FOO(baz, qux) f; 
} 
+0

뭔가 잘못 이해했을 수도 있지만 다음과 같이 컴파일됩니다. [http://pastebin.com/XVWzLSdR] (http://pastebin.com/XVWzLSdR) – mirt

+0

매개 변수를 직접 전달하는 것은 문제가되지 않습니다. 나는 주어진 예제 에서처럼 매개 변수를 전달하는 데 흥미 롭다 (위의 링크를 보라). – mirt

+0

@mirt : 그건 당신이 할 수없는 일입니다. 멤버에 대한 포인터는 메모리에있는 주소 일뿐입니다. 따라서 상수 표현의 경우에만 템플리트를 특수화하는 데 사용할 수 있습니다. 함수 인수는 상수식이 아닙니다. –

관련 문제