2009-11-26 2 views
8

다음 코드를 고려하십시오.멤버에 대한 포인터에 액세스 할 수 없습니다. 왜?

template<class T, class F>   struct X {}; 
template<class T, class F, T F::* m> struct Y {}; 

struct Foo { 
    int member; 
    typedef X<int, Foo>    x_type; // works well 
    typedef Y<int, Foo, &Foo::member> y_type; // ERROR 
}; 

typedef Y<int, Foo, &Foo::member> y_type2; // OK 

컴파일러에서 오류가 발생하는 이유는 무엇입니까? (VS2008)


새로운

이 버그를 connect.microsoft.com에 게시했습니다.

+1

당신이 사용하는 어떤 컴파일러? g ++ 4.3.3에는 오류가 없습니다. – sth

+0

컴파일러에서 반환되는 오류는 무엇입니까? – luc

+2

"Y"템플릿의 선언을 이해할 수 없습니다. 템플릿 매개 변수는 유형 또는 정수 값입니다. "TF :: * m"은 템플릿을 매개 변수화 할 수있는 유형이 아닙니다 ... "Y "라고 쓰면 마지막 매개 변수는 형식이 아니며 형식이 아닙니다. 정수 값. 멤버에 대한 포인터입니다. 따라서, 나는 믿을 만하다, 거부되어야한다 ... – SadSido

답변

1

이것은 bug

+1

내가 말한 것 (http://stackoverflow.com/questions/1802204/i-can-not-get-access-to-pointer-to-member-why/1802365#1802365) –

7

Visual C++에서는 그 시점에서 멤버에 대한 포인터의 크기를 알지 못하는 것과 관련이 있다고 생각합니다. 예를 들어 this 결함 보고서를 확인하십시오 (here은 구성원 변수에 대한 포인터의 또 다른 문제점입니다). Visual C++ 버그가 하나 더 발견되어 connect.microsoft.com에보고해야한다고 생각합니다.

+0

나는 '버그'이론과 일치합니다. 나는 최근에 같은 문제에 걸려 넘어졌지만, 회원 위치에 대한 템플릿 클래스 인수를 아직 완벽하게 지원하지 못했다는 것을 발견했다. – xtofl

+0

그러나 컴파일러는 _size_, imho를 알 필요가 없습니다. – xtofl

+0

'sizeof (& Foo :: member)'가'Foo' 선언에 따라 1 또는 그 이상일 수 있다는 것을 의미합니다. –

0

같은 문제가 발생했습니다. VC++에서 포인터 - 구성원 템플릿 인수에 대한 지원은 여전히 ​​제한적입니다 (bug report 참조).

내 경우에는 템플릿 함수 i.s.o를 사용하여 문제를 해결할 수있었습니다. 템플릿 클래스 :

template< typename Class > struct CMemberDumper { 
    Class& object; 
    template< typename M > void visit_member(M C::*pm) { 
     std::cout << object.*pm; 
    } 
}; 
+3

귀하의 버그는 내 문제와 관련이 없습니다. 컴파일러 오류없이 잘 작동합니다. VS2008을 사용합니다. –

관련 문제