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

时间:2014-02-28 05:41:10

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

我无法弄清楚我做错了什么。从指针到基类成员的模板推导中的问题 - & 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,隐式部分特化(测试)附加测试函数重载。

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

1 个答案:

答案 0 :(得分:1)

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

  

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

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

- 结束示例]

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