为什么有些编译器会坚持模板基类的合格成员公共成员,而对非模板类不要求相同呢?请看下面代码:模板类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中,那么只需要执行此操作 - 每个地方都会感到不便。谢谢 –