2013-09-29 54 views
1
// This compiles and runs properly 
using MemPtr = Entity&(OBFactory::*)(const Vec2i&, float); 
void test(MemPtr mptr, const Vec2i& p, float d) 
{ 
    (getFactory().*mptr)(p, d); 
} 

// "no matching function for call to `test`, 
// failed candidate template argument deduction" 
template<typename... A> using MemPtr = Entity&(OBFactory::*)(A...); 
template<typename... A> void test(MemPtr<A...> mptr, const Vec2i& p, float d) 
{ 
    (getFactory().*mptr)(p, d); 
} 

... 

// I call both versions with 
test(&OBFactory::func, Vec2i{0, 0}, 0.f); 

爲什麼沒有可變參數模板版本的工作?我錯過了一些轉發?可變參數模板成員函數指針聲明/使用問題

+0

你如何調用test()的第二個版本? – Oberon

+0

@Oberon:更新的主要問題 –

+1

OBFactory有多少個'func'?如果不止一個,那麼對於哪個選擇是不明確的。如果可能的話,你能否提供一個最小*完整*程序例如'ideone'? –

回答

1

我認爲這可以作爲什麼是你的代碼發生的例子:

struct A 
{ 
    // there are multiple overloads for func (or a template?) 
    void func(double) {} 
    void func(int) {} 
}; 

//using MemPtr = void(A::*)(double); 
//void test(MemPtr mptr, double d) 
//{ 
// (A().*mptr)(d); 
//} 

template<typename... As> using MemPtr = void(A::*)(As...); 
template<typename... As> void test(MemPtr<As...> mptr, double d) 
{ 
    (A().*mptr)(d); 
} 

int main() 
{ 
    // test(&A::func, 0.); // line X 
    test(static_cast<void(A::*)(double)>(&A::func), 0.); // line Y 
} 

排隊的問題,X是您使用&A::func和編譯器現在需要推斷As... - 它可以「T。 Y行通過明確地將其轉換爲正確的過載來修復該問題。

如果您使用的test第一個版本(一個以上註釋掉),test的簽名包含必要的類型已經(沒有扣除需要)和編譯器知道怎麼投(在這種情況下,這意味着選擇func的正確超載。