нет ошибки совпадающей функции в случае связи между базовым классом и расширенным классом

Я получил два класса: TJob и Reload_Job. Reload_Job расширяется от TJob:

class reload_job: public TJob

Я получил функцию:

void run_all_threads(std::vector<TJob*> &jobs){...}

и звонок:

std::vector<reload_job*> jobs;
thread_pool->run_all_threads(jobs); //error: No matching function

Получил ошибку при этом вызове. Однако, если я изменил форму функции на:

void run_all_threads(TJob* job)

и вызов:

reload_job* job;
thread_pool->run_all_threads(job); it work

Не могли бы вы, ребята, помочь мне объяснить, почему я получил ошибку компиляции в случае вектора указателя Tjob. Спасибо!

0

Решение

Ваша проблема связана с тем, что вектор< reload_job *> не является подтипом вектора< TJob *>, хотя reload_job является подтипом TJob.

В вашем первом примере компилятор ищет функцию с подписью run_all_threads(vector < reload_job* >), Там нет функции с этой подписью.

void run_all_threads(std::vector<TJob*> &jobs){...}
std::vector<reload_job*> jobs;
thread_pool->run_all_threads(jobs); //error: No function matches run_all_threads(vector <reload_job*>)

Однако во втором случае reload_job является TJob, поэтому компилятор соответствует функциям.

void run_all_threads(TJob* job)
reload_job* job;
thread_pool->run_all_threads(job); The compiler matches the function

Чтобы решить вашу проблему, измените параметр на функцию, чтобы быть vector< TJob* >, Вы можете сохранить reload_jobs в vector < TJob* >, так как reload_job является TJob.

void run_all_threads(std::vector<TJob*> &jobs){...} // function signature doesn't change
std::vector<TJob*> jobs; // this vector can store TJob and/or reload_job
thread_pool->run_all_threads(jobs); // now the types match
1

Другие решения

Я написал подобный вид скелета класса, где я не видел никаких проблем.
Вы дадите больше деталей о реализации вашего класса.

класс TJob
{
общественности:
TJob ()
{
}

};

класс reload_job: общедоступный TJob

{

общественности:
reload_job ()
{

}

void run_all_threads (std :: vector &работы)
{

}
};

int main () {

std::vector<TJob*>vec;
vec.push_back(new reload_job());

reload_job rj;
rj.run_all_threads(vec);

вернуть 0;

}

0

Функция принимает std::vector<TJob*> и вы пытаетесь передать это std::vector<reload_job*>, Это действительно настолько просто. Это разные векторы, даже если их содержимое конвертируемо.

0