2014-02-28 58 views
0

我弄不清楚我做錯了什麼。從指向基類成員的指針模板演繹中的問題 - & 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指定的類。就是那個問題。如果您有更優雅的問題解決方案,歡迎。

+0

你可能會發現它有趣的「偉大的工程」*不會*在鐺3.3。 '測試',然而,*確實*。 – WhozCraig

+0

好吧,這不包括一個解決方法,但問題在哪裏? – skondratov

+0

對於你的另一個模板參數的解決方法,我會說它實現它作爲'模板<類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

回答

1

&Derived::BaseClassMemberint Base::*而不是int Derived::*。請參考標準:

運算符的一元運算結果&是一個指向其操作數的指針。操作數應爲左值或限定符號。如果操作數是一個合格-ID命名一些類C的非靜態成員mT類型,則結果的類型是「指針T類型的C類的成員」,是一個指定prvalue C::m。 [... ...跳過] [例:

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

- 結束舉例]

你得值轉換爲int Derived::*如果需要此類型。

+0

感謝您的回答,我發現這個鏈接後,你的提示。在此處留下詳細信息。 http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2013/n3772.pdf – skondratov