[英]C++ template class: No instance of constructor matches the argument list
評論:由於某些人要求我發布完整的代碼,因此我再次發布了此問題。 這里是:
我有一個函數指針typedef看起來像這樣:
template<typename USER_DATA>
class RowProcessor
{
typedef void (*RowFunction)(USER_DATA, std::vector<USER_DATA> &);
RowProcessor(RowFunction, int) {};
};
然后我在另一個類UseRowProcessor中使用:
class UseRowProcessor {
public:
void AddUserData(SomeClass, std::vector<SomeClass> &);
void LoadUserData();
};
void UseRowProcessor::AddUserData(SomeClass c, std::vector<SomeClass> &v) {
v.push_back(c);
}
void UseRowProcessor::LoadUserData() {
RowProcessor<SomeClass> myRowProcessor(AddUserData, 1); // ERROR!!
}
因此,在調用RowProcessor的構造函數時會發生錯誤。
完整的錯誤消息說
no insatnce of constructor "RowProcessor<USER_DATA>::RowProcessor [with USER_DATA=SomeClass]" matches the argument list
argument types are: (void (SomeClass c, std::vector<SomeClass, std::allocator<SomeClass>> &v), std::vector<SomeClass, std::allocator<SomeClass>>)
,除了構造函數參數不匹配之外,我不知道該說什么。
為什么我的AddUserFunction不匹配函數指針typedef?
更改功能:
void AddUserData(SomeClass, std::vector<SomeClass> &);
到static void AddUserData(SomeClass, std::vector<SomeClass> &);
。
由於它是類成員函數,因此此參數將在編譯器之后添加,因此它不是函數指針的類型。 通過將其更改為靜態,不會添加此參數。
正如Matt所說的那樣,您需要一個static
函數來使其正常工作
class UseRowProcessor {
public:
static void AddUserData(SomeClass, std::vector<SomeClass> &);
void LoadUserData();
};
這是完全固定的示例 (固定為static
之后,還有更多問題)。
成員函數與普通函數不同,這會繼承其類型。 有一組變通辦法,使您可以將成員函數指針傳遞給以普通函數指針作為其參數的函數,但是,如果您對代碼有控制權,則應該采用不同的路徑。 而不是接受函數指針,而是接受函子。
template<typename Functor>
int f(Functor func) {
// use func like you would a function, e.g. call it with arguments func(1, 2)
}
現在,您可以使用lambda,函數對象,成員函數指針(將其綁定到this
)或函數指針來調用f。
如果要避免使用模板,請改為接受std::function
,但是只有在有特殊原因的情況下才應這樣做。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.