2011-05-07 90 views
4

當編寫一個框架,我有以下問題: 我有class Aclass 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*。是否可以撰寫前瞻性聲明?或者我需要不同的東西?

是的,我搜索了,我看到有很多關於模板聲明的帖子,但找不到解決我個人的問題。這對我來說有點複雜。

感謝您的幫助。

回答

9

您的轉發聲明不正確。它需要是:

template <class Number> 
class B; 
    ^no argument list 
+0

謝謝:)它在這個簡單的例子。但我仍然想知道爲什麼它不能在我的框架中工作。如果我查找原因,我會寫。 – leuays 2011-05-07 18:19:36

+0

好吧,我知道我做錯了 - 編譯器開始顯示「_B不是模板類型_」而不是「_B不是模板_」。這是主要問題。這是因爲在一個文件中有'class B'聲明(舊文件,我忘記重新使用模板)。這就是爲什麼我不能聲明:'template B'(編譯器知道「未模板化」B,所以它不允許我進行新的聲明)。因爲它,我認爲沒有參數列表的聲明是錯誤的,但它是正確的。再次感謝 :)。 – leuays 2011-05-07 18:50:44