Joh*_*ogo 3 c++ oop inheritance
为什么某些编译器会坚持要求模板基类的成员公共成员,而非模板类不需要相同?请查看以下代码清单:
模板类:
#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;
}
Run Code Online (Sandbox Code Playgroud)
非模板类:
#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;
}
Run Code Online (Sandbox Code Playgroud)
上述代码清单之间的显着差异在于,虽然第一个清单使用模板类,但第二个清单不使用模板类.
现在,两个列表都可以使用Microsoft的Visual Studio Compiler(cl)进行编译,但第一个列表WONT使用Digital Mars Compiler(dmc)和Minimalist GNU for Windows(MinGW-g ++)编译器进行编译.我会得到一个错误,例如"vval_未在范围内声明" - 这个错误我很明白这意味着什么.
如果我有资格进入TestImpl的公共变量vval_使用TestImpl <T> :: vval_代码工作.在第二个清单中,当派生类访问基类的vval_变量而不限定它时,编译器不会抱怨.
关于这两个编译器以及可能的其他编译器,我的问题是为什么我应该能够直接从非模板类继承的非模板类中直接访问(不限定)vval_变量,而我不能从从模板类继承的模板类?
小智 6
你必须vval_使用它TestImpl<T>来告诉编译器它取决于Tin 的实际类型Test<T>(TestImpl<T>在定义之前可能会声明一些部分/显式Test<T>特化,并且它的实例化将改变该vval_上下文中的含义.为了让编译器意识到这一点,你必须告诉它vval_(模板参数)依赖.
另见http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html