从指针到基类成员的模板推导

Template deduction from pointer to base-class member

本文关键字:成员 指针 基类      更新时间:2023-10-16

我不知道我做错了什么。从指针到基类成员的模板推导中的问题 - &DerivedClass::BaseClassMemeber。

完整示例:

#include <vcl.h>
#include <tchar.h>
struct Base
{
   int BaseClassMember;
};
struct Derived : public Base
{
};
template<class T1, class T2>
void Test(T1& Param1, T2 T1::* Param2)
{
}
int _tmain()
{
   Derived inst;
   // Compile error E2285 Could not find a match for 'Test<T1,T2>(B,int A::*) - BCC32
   // Error 1 error C2782: 'void Test(T1 &,T2 T1::* )' : template parameter 'T1' is   ambiguous - MS VS8
   Test(inst, &Derived::BaseClassMember);
   // Works great
   Test<Derived>(inst, &Derived::BaseClassMember);
   return 0;
 }

我可以找到几种解决方法,例如,附加测试函数重载了一个模板参数,static_cast隐式部分专用化(测试)。

但是我对为什么编译器不能使用在&DerivedClass::BaseClassMemeber中明确指定的类的原因感兴趣。这就是问题所在。如果您有更优雅的问题解决方案,欢迎。

&Derived::BaseClassMember的类型为 int Base::*,而不是 int Derived::* 。标准:

一元&运算符的结果是指向其操作数的指针。操作数应为左值或限定 ID。如果操作数是一个限定 id,命名某个类C的非静态成员m类型为 T,则结果的类型为"指向类型 T 的类 C 成员的指针",并且是指定C::m的 prvalue 。[...跳过...][示例:

struct A { int i; };
struct B : A { };
... &B::i ...             // has type int A::*i

— 结束示例]

如果需要此类型,则必须将值强制转换为 int Derived::*