1
我遇到C2783錯誤用Visual C++(不能推斷模板參數),我有以下測試例:無法推斷模板參數&指針構件
enum SPKType { A, B, C, D };
template<SPKType TypeCode, class ObjectType, typename U>
struct SPKSetterPattern
{
typedef void (ObjectType::* func)(U);
};
template<class ObjectType, typename U>
struct SPKSetterPattern<B,ObjectType,U> { typedef void (ObjectType::* func)(U,U); };
template<class ObjectType, typename U>
struct SPKSetterPattern<C,ObjectType,U> { typedef void (ObjectType::* func)(U,U,U); };
template<class ObjectType, typename U>
struct SPKSetterPattern<D,ObjectType,U> { typedef void (ObjectType::* func)(U,U,U,U); };
template<typename ObjectType, SPKType TypeCode>
struct helper
{
template<typename U>
static inline void add(ObjectType* obj, typename SPKSetterPattern<TypeCode,ObjectType,U>::func attrSetter) {}
//static inline void add(ObjectType* obj, void (ObjectType::*attrSetter)(U)) {}
};
class test
{
public:
template<typename ObjType>
void init()
{
// Supposed to work
helper<ObjType,A>::add(this, &test::setA);
//helper<ObjType,B>::add(this, &test::setB);
//helper<ObjType,C>::add(this, &test::setC);
//helper<ObjType,D>::add(this, &test::setD);
helper<ObjType,A>::add(this, &test::setAf);
// Supposed to fail
//helper<ObjType,B>::add(this, &test::setBf);
}
test() { init<test>(); }
void setA(int a) {}
void setB(float,float) {}
void setC(int,int,int) {}
void setD(int,int,int,int) {}
void setAf(double a) {}
void setBf(int,double) {}
};
int main()
{
test t;
return 0;
}
當註釋行
static inline void add(ObjectType* obj, typename SPKSetterPattern<TypeCode,ObjectType,U>::func attrSetter) {}
並取消註釋行後面的代碼編譯。
我不明白爲什麼,因爲我的第二個參數「幫手::添加」仍然是相同的......
感謝您的幫助。
感謝您的澄清。 但是,這是標準禁止嗎?有沒有辦法做到這一點? – Synxis 2012-03-11 09:01:55
向上。有沒有辦法做到我在我的問題中暴露的內容?我可以通過明確定義每個專業化來解決問題,但它會導致代碼重複... – Synxis 2012-03-13 08:50:10
@Synxis:請參閱編輯。 – 2012-03-13 16:27:00