4
當編寫一個框架,我有以下問題: 我有class A
和class B
wchich從class A
的。正向聲明:模板和繼承
class A
有一個功能,返回B*
。
當然,這並不難:
#include <iostream>
using namespace std;
class B; // forward declaration
class A
{
public:
B* ReturnSomeData();
};
class B : public A
{
};
// Implementation:
B* A::ReturnSomeData()
{
return new B; // doesn't matter how the function makes pointer
}
int main()
{
A sth;
cout << sth.ReturnSomeData(); // print adress
}
但是我不得不使用模板喜歡這裏:
#include <iostream>
using namespace std;
// This "forward declaration":
template <class Number>
class B<Number>;
// cannot be compiled:
// "7 error: 'B' is not a template"
template <class Number>
class A
{
public:
B<Number>* ReturnSomeData();
};
template <class Number>
class B : public A<Number>
{
};
// Implementation:
template <class Number>
B<Number>* A<Number>::ReturnSomeData()
{
return new B<Number>;
}
int main()
{
A<int> sth;
cout << sth.ReturnSomeData();
}
看看代碼。正如你所看到的,我不知道如何處理未知的A B*
。是否可以撰寫前瞻性聲明?或者我需要不同的東西?
是的,我搜索了,我看到有很多關於模板聲明的帖子,但找不到解決我個人的問題。這對我來說有點複雜。
感謝您的幫助。
謝謝:)它在這個簡單的例子。但我仍然想知道爲什麼它不能在我的框架中工作。如果我查找原因,我會寫。 – leuays 2011-05-07 18:19:36
好吧,我知道我做錯了 - 編譯器開始顯示「_B不是模板類型_」而不是「_B不是模板_」。這是主要問題。這是因爲在一個文件中有'class B'聲明(舊文件,我忘記重新使用模板)。這就是爲什麼我不能聲明:'template B'(編譯器知道「未模板化」B,所以它不允許我進行新的聲明)。因爲它,我認爲沒有參數列表的聲明是錯誤的,但它是正確的。再次感謝 :)。 –
leuays
2011-05-07 18:50:44