C++ 我无法访问指向成员的指针。为什么?

C++ 我无法访问指向成员的指针。为什么?,c++,templates,pointer-to-member,C++,Templates,Pointer To Member,考虑以下代码: 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, &Fo

考虑以下代码:

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
模板结构X{};
模板结构Y{};
结构Foo{
国际会员;
typedef X_type;//工作正常
typedef Y_type;//错误
};
typedef Y_type2;//好啊
为什么编译器会产生错误?(VS2008)


新的


我把这个bug发布到.< /p> 我认为它与VisualC++不知道指向那个成员的指针的大小有关。例如,检查缺陷报告(是指向成员变量的指针的另一个问题)。我认为你发现了一个更为直观的C++错误,应该报告连接。微软.com。< /P> < P>我偶然发现了同样的问题。VC++中对指向成员模板参数的指针的支持仍然有限(请参阅)

在我的例子中,我可以通过使用模板函数I.s.o.模板类来解决这个问题:

template< typename Class > struct CMemberDumper {
    Class& object;
    template< typename M > void visit_member( M C::*pm ) {
       std::cout << object.*pm;
    }
};
templatestructcmemberdumper{
类别与对象;
模板无效访问成员(M C::*pm){

std::cout这是一个

你在使用什么编译器?g++4.3.3没有错误。我无法理解“Y”模板的声明。模板参数是类型或整数值。“tf::*m”不是一个类型,当你写“Y”时,你可以用它来参数化模板,最后一个参数不是类型,也不是整数值。它是指向成员的指针。因此,我相信,它必须被拒绝…在Visual Studio 2008中:“'Foo::member':不是类型名、静态或枚举数”,并且在同一行中:“'member':未声明的标识符”来自14.1:非类型模板参数应具有以下类型之一[...]指向“成员”的指针。“不”,我们不能只按我们喜欢的方式去弯曲规则。指针和成员指针就是它们,整数/积分就是它们。成员指针甚至不是C++中的指针。它们是成员指针,它是一个单独的类型。我与“bug”理论重合。最近我遇到了同样的问题,发现-但不记得在哪里-他们还没有“完全支持”指向成员模板类参数的指针。但是,编译器不需要知道大小,imho。我的意思是
sizeof(&Foo::member)
可能是1或更多,这取决于
Foo
声明。可能是(我不确定)VC++是一个重要的理论。它不是一个理论。这个行为是用VC++来的,它指向成员函数。这个例子是数据。不同的原因是指针指向一个虚拟函数,但是没有虚拟数据。你的bug与我的问题无关。它没有任何编译就可以工作。呃错误。我用的是VS2008。这就是我说的()