2013-04-09 2 views
0

У меня есть два класса: 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 

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

+0

Вектор кошки не является вектором животных, если вы хотите об этом думать. – chris

+1

Компилятор понимает, что вектор кошки является вектором животного. Итак, как я могу передать массив кошки в функцию, которая получает только массив животных? – khanhhh89

ответ

0

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

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

};

класс reload_job: общественный TJob

{

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

}

недействительным run_all_threads (станд :: вектор & заданий) {

} };

INT Основной() {

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

reload_job rj; 
rj.run_all_threads(vec); 

возврат 0;

}

+0

Спасибо за ваш продуманный экзамен. Я копирую ваш код и компилирую снова, а затем получаю ту же ошибку: «нет подходящей функции для вызова« reload_job :: run_all_threads »(std :: vector > &) '" – khanhhh89

+0

кроме того, ваш метод: «run_all_threads (std :: vector & jobs)» должно быть: «run_all_threads (std :: vector jobs)» – khanhhh89

1

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

В вашем первом примере компилятор выполняет поиск функции с подписями 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 
+0

Это так просто, но .. удивительно. Спасибо. Это решило мою проблему. – khanhhh89

0

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

+0

Он решил проблему. спасибо – khanhhh89

Смежные вопросы