以下錯誤令我困惑。這是一個非常複雜的代碼片段。我覺得奇怪的是,只有模板化的構造函數和虛擬方法的存在纔會導致錯誤,並且僅在複製初始化對象時纔會導致錯誤。使用複製構造函數並存在虛函數時出現「在所有控制路徑上遞歸」的錯誤
有沒有人有想法?謝謝。
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 2013-04-04 02:06:03
從技術上講,它不是*拷貝構造函數*,而是一個*轉換構造函數*。 A * copy-constructor *接受與源相同類型的對象,而* conversion-constructor *接受不同類型的對象。模板構造函數不能是*拷貝構造函數*。 – 2013-04-04 03:53:18
@DavidRodríguez-dribeas謝謝。更確切地說,只有該模板構造函數的特殊性(其中'T'是'A')是複製構造函數。 – congusbongus 2013-04-04 04:02:58