簡體   English   中英

C ++模板類:沒有構造函數的實例與參數列表匹配

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM