爲什麼有些編譯器會堅持模板基類的合格成員公共成員,而對非模板類不要求相同呢?請看下面代碼:模板類vs私有繼承
模板類:
#include <iostream>
using namespace std;
template <class T>
class TestImpl {
public: // It wont make a difference even if we use a protected access specifier here
size_t vval_;
TestImpl(size_t val = 0) : vval_(val) { }
};
template <class T>
class Test : public TestImpl<T> {
public:
Test(size_t val) : TestImpl<T>(val) {
cout << "vval_ : " << vval_ << endl; // Error: vval_ was not declared in this scope
//! cout << "vval_ : " << TestImpl<T>::vval_ << endl; // this works, obviously
}
};
int main() {
Test<int> test1(7);
return 0;
}
非模板類:
#include <iostream>
using namespace std;
class TestImpl {
public: // It wont make a difference even if we use a protected access specifier here
TestImpl(size_t val = 0) : vval_(val) {}
size_t vval_;
};
class Test : public TestImpl {
public:
Test(size_t val) : TestImpl(val) {
cout << "vval_ : " << vval_ << endl;
}
};
int main() {
Test test1(7);
return 0;
}
在上面的代碼之間的顯著差別是,雖然第一個列表使用模板類,第二個列表不。
現在,這兩個列表將編譯罰款與微軟的Visual Studio編譯器(CL),但首批上市WONT同時與數字火星編譯(DMC)和編譯簡約GNU爲Windows(MinGW的 - g ++)編譯器。我會得到一個錯誤,如「vval_未在範圍中聲明」 - 一個錯誤,我很明白它的含義。
如果我有資格獲得使用TestImpl <牛逼> :: vval_代碼工作的TestImpl的公共變量vval_。在第二個列表中,當派生類訪問基類'vval_變量而不限定它時,編譯器不會抱怨。
對於兩種編譯器可能還有其他人,我的問題是,爲什麼我應該能夠從非模板類與非模板類繼承直接訪問(不符合條件)vval_變量直接,而我不能從做同樣的模板類繼承自模板類?
您也可以限定'vval_':'this-> vval_'。 –
http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19 – visitor
@Rob:this-> vval_適用於派生類。當使用「以某種類型的繼承來實現」時,如果您的實現的重要部分位於基礎claas中,那麼只需要執行此操作 - 每個地方都會感到不便。謝謝 –