我使用的是Clang ++ 3.9.1。
我试图构建一个类层次结构,其中许多基类都是模板化的。这些类只在其派生类的定义中实例化。虽然派生类是不模板化的,但似乎在层次结构中存在多于一代的模板类并且隐藏了#34;这些基类的成员名称。
#include <iostream>
struct MostBase {
char r;
MostBase() : r('r') {}
};
template < typename S >
struct Base : public MostBase {
S s;
Base (S s_) : MostBase(),s(s_) {}
};
template < typename T >
struct Derived : public Base<T>
{
T t;
Derived (char ch ) : Base<T>(ch) { t = 't'; }
void print() {
std::cout << r << " " << s << " " << t << std::endl;
}
};
int main (int argc, char* argv[])
{
Derived<char> x ('s');
d.print(); // should be: "r s t\n"
}
我收到的错误消息是:
template-base.cpp:21:18: error: use of undeclared identifier 'r'
std::cout << r << " " << s << " " << t << std::endl;
^
template-base.cpp:21:30: error: use of undeclared identifier 's'
std::cout << r << " " << s << " " << t << std::endl;
^
对这些模板类进行子类化以避免这种隐藏的正确方法是什么?
我很想认为这是一个错误,因为如果层次结构中只有一个模板化的类向上,则名称不会被隐藏,一切正常。
我必须使用 using Base::s
中的 using MoreBase::r
和 Derived
语句我想使用的每个成员变量?
这似乎适用于这个小例子,但实际应用程序中的成员变量要多得多。