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