Прежде всего, вы создаете shared_ptr
с именем:
auto b = std::make_shared<B<std::string>>();
Типа std::shared_ptr<B<std::string>>
и
std::shared_ptr<A<std::string>> a = b;
Типа std::shared_ptr<A<std::string>>
...
Однако в параметре вашей функции есть:
void proc(std::shared_ptr<A<T>> &a)
, который указывает только на shared_ptr
из A , а не B так что очевидно , что B не станет A ...
Решением будет удаление lvalue ссылка a
из определения функции, например:
void proc(std::shared_ptr<A<T>> a)
, поэтому она не относится к A и B можно легко преобразовать в A во время вызова функции ...
Редактировать: Добавлено объяснение ...
Объяснение:
Помните указатели?от C ... да , они выполняют одинаковую функцию ссылок :
// Compilable both in C and C++...
int add(int a, int b, int * more_than_3) {
int const result = a + b;
if (result > 3)
*more_than_3 = 1;
return result;
}
Да, эти функции будут типы псевдо-возврата в C. Как:
// Compilable both in C and C++...
int main(void) {
int more_3;
int const res = add(2, 3, &more_3);
printf("Sum of 2 + 3 is %i\n", res);
if (more_3)
printf("Given two numbers' sum is more than 3");
}
Здесь передается дополнительный аргумент, который принимает адрес переменную ( Ссылки также делают то же самое, они делят свой адрес с переменной, на которую они ссылаются ... )
Помните , хранилище ссылок и указателей адрес другой переменной внутри них ...
Это может быть причиной того, что они заставили адрес оператора (&
) также действовать для ссылки в C ++ ...
Тоже, ненужный, но ответ, который был выложен здесь @ songyuanyao сработало, потому что:
void proc(std::shared_ptr<A<T>> const &a)
использует постоянную ссылку , ссылку на постоянное выражение , а не переменную , так это дине имеет значения, если они не соответствуют (A
и B
)