我知道不会在依赖基类模板上执行对依赖member/typedef
的查找,对于基成员,我必须显式地以this->member
为前缀,或者{ {1}}代表基类上的typename base<T...>::sometype
。
所有可以找到的答案都建议使用typedef/using
。很明显,它可以是派生类中的typedef,例如typename base<T...>::sometype
,然后到处都是using base_type = base<T...>
,但这需要在派生类和typedef中都重复基类参数。
但是,当我使用typename base_type::some_type
而不是指定基类时,它确实可以工作。 for example
derived::sometype
这使我可以使用template <typename T>
struct base
{
using type = T*;
};
template <typename T>
struct derived : base<T>
{
derived ()
{
typename derived::type l; // <- Here
}
};
int main() {
derived <int> v;
return 0;
}
,并且重要的是,它可以节省除类定义和基派生之外的任何重复的模板参数。
从this的答案看来,编译器只需要知道该名称是从属名称,即可在第二阶段中进行查找,并且使用派生名称来实现此目的?
我发现所有答案都建议使用injected class name
来命名从属名称,我很想知道使用base<T...>
来访问基本类型的依存类型是否有问题?
编辑:
似乎也注入了基类名称,依此类推
仅需injected class name
即可不必重复基类类型。至少在知道基类名称的情况下。
有趣的是,2009年有一个proposal能够别名基类,当不知道基类的名称或继承了同一基的多个专业化名称时,这将解决该问题。尽管该提案被拒绝,但是说“鼓励论文作者继续朝着更普遍的解决方案的方向发展。”
有人建议在其他地方讨论此问题,这将提供更通用的解决方案,并允许对别名进行别名并使用其注入的名称。但是据我所知,还没有提议。
using base_type = derived::base;
答案 0 :(得分:1)
只有在成员名称含义上存在分歧时才有问题。只要由基数定义名称,就不会有问题,但是如果派生类型将其重新定义为其他名称,则将选择派生成员。