Я получил два класса: 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. Спасибо!
Ваша проблема связана с тем, что вектор< 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
Я написал подобный вид скелета класса, где я не видел никаких проблем.
Вы дадите больше деталей о реализации вашего класса.
класс 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;
}
Функция принимает std::vector<TJob*>
и вы пытаетесь передать это std::vector<reload_job*>
, Это действительно настолько просто. Это разные векторы, даже если их содержимое конвертируемо.