【发布时间】:2018-06-24 10:21:51
【问题描述】:
前几天,我发现这是可能的:
template <class T> struct base {};
struct derived: base<int> {};
int main()
{
// The base class template is accessible here
typename derived::base<double> x;
// from the comments, even this works
typename derived::derived::base<double>::base<int>::base<void> y;
}
我不记得曾经在 cppreference 或 C++ 教程中阅读过这篇文章,或者在巧妙的模板元编程技巧中使用过这篇文章(因为我确信它可以)。我有几个问题:
- 这东西有具体的名字吗?
- 它在 C++ 标准和 cppreference 中的什么地方记录?
- 是否有任何模板元编程技巧可以利用这一点?
【问题讨论】:
-
请注意,
base<double>不是derived<int>的基类。 -
@MarkRansom 我不认为这是完成任何事情的尝试。相反,这是一个奇怪的观察。在您期望需要使用命名空间
space限定base<double>的地方,在此示例中使用derived<int>似乎可以完成同样的事情。 -
仅供参考,clang 给出以下警告,这让我认为这是不合法的 c++:
<source>:7:57: warning: ISO C++ specifies that qualified reference to 'base' is a constructor name rather than a template name in this context, despite preceding 'typename' keyword [-Winjected-class-name] typename derived::derived::base<double>::base<int>::base<void> x;,箭头指向最后一个base的开头。 -
更简单的版本似乎在这里抛弃了一些实用程序,因为
base不再位于远程命名空间中。
标签: c++ c++11 inheritance language-lawyer template-meta-programming