user2436815
user2436815

Reputation: 3915

C++ template class: No instance of constructor matches the argument list

Comment: I'm posting this question again, since some people requested me to post the full code. Here it is:

I have a function pointer typedef that looks like this:

template<typename USER_DATA>
class RowProcessor
{
    typedef void (*RowFunction)(USER_DATA, std::vector<USER_DATA> &);

    RowProcessor(RowFunction, int) {};
};

and then I'm using in another class 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!!
}

So the error occurs when calling RowProcessor's constructor.

The full error message says that

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>>)

, which I have no idea what it says except for the fact that the constructor arguments do not match..

Why doesn't my AddUserFunction match the function pointer typedef??

TEST LINK<<<<<<<<

Upvotes: 0

Views: 2836

Answers (3)

pmr
pmr

Reputation: 59841

Member functions are different from ordinary functions and this carries over to their type. There is a set of work-arounds that enable you to pass member function pointers to functions that take ordinary function pointers as their parameters, but if you have control over the code you should take a different path. Instead of accepting a function pointer accept a functor.

template<typename Functor>
int f(Functor func) {
  // use func like you would a function, e.g. call it with arguments func(1, 2)

}

Now you can call f with a lambda, function object, member function pointer (after you bound it to this), or function pointer.

If you want to avoid templates, accept a std::function instead, but this should only be done if you have special reasons for it.

Upvotes: 0

πάντα ῥεῖ
πάντα ῥεῖ

Reputation: 1

As Matt said you need a static function to get this working

class UseRowProcessor {
public:
    static void AddUserData(SomeClass, std::vector<SomeClass> &);
    void LoadUserData();
};

Here's the completely fixed sample (there were some more issues after fixing to static).

Upvotes: 0

Matt
Matt

Reputation: 6050

Change the function:

void AddUserData(SomeClass, std::vector<SomeClass> &);

to static void AddUserData(SomeClass, std::vector<SomeClass> &); .

As it is a class member function, the this parameter will be added after compiler, so it is not the type of the function pointer. By changing it to static, no this parameter will be added.

Upvotes: 1

Related Questions