Ошибка ниже меня сбивает с толку. Вот короткая часть гораздо более сложного кода. Мне кажется странным, что только существование шаблонного конструктора и виртуального метода вызывает ошибку и только при копировании инициализации объекта.Ошибка «рекурсивная на всех путях управления» при использовании конструктора копирования и присутствия виртуальной функции
У кого-нибудь есть идеи? Благодарю.
class A
{
long *p;
public:
A():p(0)
{
}
template<class T>
A(T val):p(val)// 1
{
}
operator long*()
{
return p;
}
};
class B
{
virtual void f()// 2
{
}
};
class C : public A, public B
{
};
void main()
{
C c;
Следующая строка main()
является
A a=c;
и это вызывает ошибку ниже, если обе линии, отмеченные // 1
и // 2
присутствуют:
warning C4717: 'C::C' : recursive on all control paths, function will cause runtime stack overflow
Но когда используется следующее в main()
, нет ошибки:
A a;
a=c;
}
Спасибо за полноту, действительно, мне нужно будет использовать ссылку. – user883041
Технически это не * copy-constructor *, а * конструктор преобразования *. A * copy-constructor * принимает объект того же типа, что и источник, в то время как * конструктор преобразования * принимает объект другого типа. Конструктор шаблонов не может быть * copy-constructor *. –
@ DavidRodríguez-dribeas спасибо. Точнее, только специализация этого конструктора шаблонов (где 'T' является' A') является конструктором копирования. – congusbongus