2

我无法弄清楚我做错了什么。从指针到基类成员的模板推导中的问题 - &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 中明确指定的类的原因感兴趣。就是那个问题。如果您有更优雅的问题解决方案,欢迎。

4

1 回答 1

2

&Derived::BaseClassMember有类型int Base::*,没有int Derived::*。标准:

一元运算符的结果&是指向其操作数的指针。操作数应该是一个左值或一个qualified-id。如果操作数是用 type命名某个类的非静态成员的限定 ID,则结果具有类型“指向类型的成员的指针”并且是指定的纯右值。[...跳过...] [示例: mCTCTC::m

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

——结束示例]

int Derived::*如果需要这种类型,则必须将值转换为。

于 2014-02-28T06:54:09.097 回答