为什么有些编译器坚持限定模板基类的公共成员,而不要求非模板类的成员相同?请看下面的代码清单:
模板类:
#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)和适用于 Windows 的极简 GNU(MinGW - g++) 编译器。我会收到类似“vval_ 未在范围内声明”的错误 - 我显然明白它的含义。
如果我有资格访问TestImpl的公共变量vval_ using TestImpl::vval_该代码有效。在第二个清单中,当派生类访问基类时,编译器不会抱怨'vval_变量而不限定它。
关于两个编译器和可能的其他编译器,我的问题是为什么我应该能够直接访问(无需限定)vval_变量直接来自a从非模板类继承的非模板类,虽然我不能做同样的事情模板类继承自模板类?
你必须有资格vval_
与TestImpl<T>
告诉编译器这取决于实际类型T
in Test<T>
(可能有一些部分/显式的专业化TestImpl<T>
在定义之前声明Test<T>
它的实例化将改变vval_
在这种情况下。为了让编译器意识到这一点,你必须告诉vval_
是(模板参数)相关的。
也可以看看http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html http://gcc.gnu.org/onlinedocs/gcc/Name-lookup.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)