2013-05-10 56 views
1

我試過C++模板類,但是我發現我不能在類A中訪問val,如果我不使用模板,就可以使用模板,即使我在B的方法中不能使用val,我仍然可以在主要函數中使用它,這種行爲真的很奇怪。 有人知道爲什麼嗎?如何使用tempate繼承基類的成員

#include <iostream> 
#include <cstdio> 
#include "name.h" 
#include <map> 
using namespace std; 

template<class T> 
class A { 
    public: 
     T val; 
     A(T obj) { 
      val = obj; 
     } 
     virtual void print() { 
      cout << "in A" << endl; 
     } 
}; 

template<class T> 
class B: public A<T> { 
    public: 
     B(T obj):A<T>(obj) { 
     } 
     void print() { 
//if you unccomment this line, this program can't be compiled, 
//   cout << val << endl; 
      cout << "in B" << endl; 
     } 
}; 

int main() { 
    string str = "`12"; 
    B<string> * b = new B<string>(str); 
    A<string> * a = (A<string> *) b; 
    b-> print(); 
    a-> print(); 
    cout << a-> val << endl; 
//but it is ok to access val like this 
    cout << b-> val << endl; 
    return 0; 
} 

回答

4

您需要將其引用爲this->val。這是因爲val就是所謂的非依賴型

您可以選擇使用using A<T>::val,或者使用A<T>::val來引用它。

C++ FAQ給出了一個(稍微)詳細的解釋。

相關問題