【发布时间】:2017-10-08 16:00:59
【问题描述】:
我使用我不熟悉的 C++ 结构回答了this 问题。我想知道这是否合法或被 g++ (6.3.0) 和 clang++ (3.5.0) 错误地允许。示例可用online:
#include <iostream>
template <typename T>
struct Base
{
using Type = int;
};
template <typename T>
struct intermediate : Base<T>
{
// 'Type' is not defined here, which is fine
};
template <typename T>
struct Derived : intermediate<T>
{
using Type = typename Derived<T>::Type; // Is this legal?
// using Type = typename intermediate<T>::Type; // Normal way of doing it
};
int main()
{
Derived<void>::Type b = 1;
std::cout << b << std::endl;
}
更新
如 cmets(underscore_d)中所述,Derived 类中不需要 <T>。也就是说,这完全没问题:
using Type = typename Derived::Type;
【问题讨论】:
-
是的,这是合法的,参见例如en.cppreference.com/w/cpp/language/dependent_name 在“未知专业”下。
-
似乎不需要模板参数
<T>,我们可以简单地写成using Type = typename Derived::Type;,其中Derived总是引用带有模板参数的当前类类型'as if'。我错过了什么吗?我记得以前使用过这种模式,而不必指定模板参数。这也是定义明确的吗? -
@underscore_d 你当然是对的,我想它是
intermediate<T>...留下的。我已经更新了问题。
标签: c++ c++11 templates language-lawyer