2010-09-26 290 views
16

我是一個新的程序員在c + +。我第一次使用模板。模板繼承C++

我有一個抽象類和另一個類擴展它。但所有的抽象類的保護成員不受其他階級的認可:

class0.h:

template<class T> 
class class0 { 

protected: 
    char p; 
public: 
    char getChar(); 
}; 

**class1.h** 
template<class T> 
class class1:public class0<T> { 
public: 
    void printChar(); 
}; 
template<class T> 
void class1<T>::printChar(){ 
    cout<< p<<endl;//p was not declared in this scope 
} 

謝謝。有一個偉大的星期=)

+0

基類要麼需要一個公共的虛擬析構函數,或保護/私有非虛析構函數。 – GManNickG 2010-09-26 20:53:49

+0

順便說一句,這個類是抽象的? – Chubsdad 2010-09-27 02:03:07

回答

26

發生這種情況的原因是模板的查找規則。

p不是依賴表達式,因爲它只是一個標識符而不是依賴於模板參數的東西。這意味着將不會搜索依賴於模板參數的基類來解析名稱p。要解決此問題,您需要使用取決於模板參數的內容。使用this->將做到這一點。

例如

cout << this->p << endl; 
+0

謝謝!這有助於=)祝你有美好的一天! – yonka 2010-09-26 20:00:23

+3

@yonka:你應該接受他的回答。 – GManNickG 2010-09-26 20:52:37

+0

@GMan:我不知道; litb現在已經發布了一個答案。 :-) – 2010-09-26 21:41:52

2

我不明白VC9中的編譯器錯誤。但是,代碼有幾個問題:首先,它不需要成爲模板類,因爲它目前正在編寫......但也許你只是簡化了這個問題?其次,基類應該有一個虛擬析構函數。

#include <iostream> 

using namespace std; 

class class0 { 
public: 
    virtual ~class0(){} 

protected: 
    char p; 
public: 
    char getChar(); 
}; 

class class1 : public class0 { 
public: 
    void printChar(); 
}; 

void class1::printChar(){ 
    cout << p << endl;//p was not declared in this scope 
} 

int main() { 
    class1 c; 
    c.printChar(); 
    return 1; 
} 

既然你正在學習的模板,我建議不要混用不同的概念(繼承&模板),同時學習。開始用這樣一個簡單的例子...

#include <iostream> 
#include <string> 

using namespace std; 

template <typename T> 
T add(const T& a, const T& b) { 
    return a + b; 
} 

int main() { 
    int x = 5; 
    int y = 5; 

    int z = add(x, y); 
    cout << z << endl; 

    string s1("Hello, "); 
    string s2("World!"); 

    string s3 = add(s1, s2); 
    cout << s3 << endl; 

    return 1; 
} 

在上面的代碼中的重要概念是,我們寫ONE功能,它知道如何添加整數和字符串(以及許多其他類型爲此事)。

+4

基類爲什麼應該有一個虛析構函數?模板通常用於實現參數多態,虛擬刪除僅用於動態多態(只有在多態刪除操作時纔有效)。 – 2010-09-26 20:10:48

+1

在這種情況下,Visual Studio 2008編譯器已知不能正確實現模板查找規則。這就是爲什麼你沒有看到錯誤。 – 2010-09-26 20:12:58

+0

@Ben福格特,好點但OP剛剛開始使用模板和我猜測,他們可能還沒有涵蓋這呢。但是看起來他們已經涵蓋了繼承,除非他專門用於編譯時多態,否則使基礎析構函數變爲虛擬是最安全的。 – dgnorton 2010-09-26 20:20:51

14

對於在依賴基類中查找一個名字,兩個條件必須滿足

  • 這是必要的查找是不是不合格
  • 這是必要這個名字是依賴

這些規則如C++ 03中所述不同於rules stated by unrevised C++98,其中滿足第二個項目符號(作出一個名稱依賴)爲足夠的用於查找在依賴基類中聲明的名稱。

在實例化時查找一個依賴名稱,除非限定查找之外的查找不會忽略依賴基類。需要滿足這兩個條件才能找到在相關基類中聲明的名稱,這兩個條件都不足以支持。爲了滿足這兩個條件,您可以使用各種結構

this->p 
class1::p 

兩個人的名字p依賴和第一版本使用類成員訪問查找和第二版本使用合格的名稱查找