基类模板中的从属名称查找

时间:2018-10-24 22:08:43

标签: c++ templates

我知道不会在依赖基类模板上执行对依赖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;

1 个答案:

答案 0 :(得分:1)

只有在成员名称含义上存在分歧时才有问题。只要由基数定义名称,就不会有问题,但是如果派生类型将其重新定义为其他名称,则将选择派生成员。