我弄不清楚我做錯了什麼。從指向基類成員的指針模板演繹中的問題 - & 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指定的類。就是那個問題。如果您有更優雅的問題解決方案,歡迎。
你可能會發現它有趣的「偉大的工程」*不會*在鐺3.3。 '測試 ',然而,*確實*。 –
WhozCraig
好吧,這不包括一個解決方法,但問題在哪裏? – skondratov
對於你的另一個模板參數的解決方法,我會說它實現它作爲'模板<類T1,類T2,類T3> typename std :: enable_if auto Test(T1&amp; Param1,T2 T3 :: * Param2) - > decltype(Param1。* Param2,void())'。他們會幫助你,如果你添加額外的'Test'重載,你需要重載解析來忽略對這個特定'Test'('Test(inst,&Unrelated :: ClassMember)')的無效嘗試調用。 –
hvd