【问题标题】:I can not get access to pointer to member. Why?我无法访问指向成员的指针。为什么?
【发布时间】:2026-02-09 08:25:01
【问题描述】:

考虑以下代码:

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

【问题讨论】:

  • 你用的是什么编译器? g++ 4.3.3 没有错误。
  • 我无法理解“Y”模板的声明。模板参数是类型或整数值。 "TF::* m" 不是类型,你可以用它来参数化你的模板...当你写 "Y" 时,最后一个参数不是类型也不是整数价值。它是指向成员的指针。所以,我相信,它必须被拒绝......
  • 在 Visual Studio 2008 中:"'Foo::member' : 不是类型名称、静态或枚举数" 并且在同一行:"'member' :未声明的标识符”
  • 从 14.1 开始:非类型模板参数应具有以下类型之一 [...] 指向成员的指针。
  • @roe,不,我们不能随心所欲地改变规则。指针和成员指针就是它们的样子,整数/整数就是它们的样子。成员指针甚至不是 C++ 中的指针。它们是 member 指针,是一个单独的类型类别。

标签: c++ templates pointer-to-member


【解决方案1】:

这是bug

【讨论】:

【解决方案2】:

我认为这与 Visual C++ 不知道指向成员的指针的大小有关。例如检查this 缺陷报告(here 是指向成员变量的指针的另一个问题)。我认为您又发现了一个 Visual C++ 错误,应该向 connect.microsoft.com 报告。

【讨论】:

  • 我同意“错误”理论。我最近偶然发现了同样的问题,发现——但不记得在哪里——他们还没有“完全支持”指向成员模板类参数的指针。
  • 但是,编译器不需要知道 size,恕我直言。
  • 我的意思是 sizeof(&amp;Foo::member) 可能是 1 或更多,具体取决于 Foo 声明。
  • 它可能(我不确定)对于 Visual C++ 很重要。这只是一个理论。
  • 不相关。带有指向成员函数的指针的 VC++ 会出现这种特殊行为。这个例子是数据。造成差异的原因是方法指针可以指向虚函数,但是没有虚数据。
【解决方案3】:

我偶然发现了同样的问题。 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;
    }
};

【讨论】:

  • 您的错误与我的问题无关。它运行良好,没有任何编译器错误。我用的是VS2008。