這裏是一個很小的代碼,顯示問題:模板拷貝構造函數的錯誤
template<typename To, typename From> To convert(const From& x);
struct A
{
int value;
template<typename T> A(const T& x) { value = convert<A>(x).value; }
};
struct B : public A { };
int main()
{
B b;
A a = b;
}
它給我:undefined reference to 'A convert<A, B>(B const&)'
正如預期的那樣,因爲我刪除默認的拷貝構造函數。但是,如果我將此行添加到A
:
A(const A& x) { value = x.value; }
我得到相同的錯誤。如果我嘗試這樣做是這樣的:(添加模板專門化)
template<> A(const A& x) { value = x.value; }
我得到:error: explicit specialization in non-namespace scope 'struct A'
。
如何解決?
我的編譯器是MinGW的(GCC)4.6.1
編輯:
的convert
功能從衆多類型轉換爲A
,然後再返回。問題在於,由於繼承原因,編寫從B
到A
的轉換函數是沒有意義的。如果我從A
中刪除了調用convert
的行,它就行了。這個想法是在的所有時間不會從A
繼承,因爲這些默認的構造函數應該足夠了。
什麼問題?你的'convert'函數沒有定義,所以你會得到一個鏈接錯誤。說'A中(的static_cast (b));',如果你刻意要觸發切片 – 2011-12-20 13:26:47
最後的錯誤可以通過移動類定義之外的專業化是固定的;它雖然不會幫助,因爲一個'A = B;'需要'B',而不是'A'專業化。 – 2011-12-20 13:37:22