有谁知道为什么 using-declarations 似乎不适用于从依赖基类导入类型名称?它们适用于成员变量和函数,但至少在 GCC 4.3 中,它们似乎被类型忽略了。
template <class T>
struct Base
{
typedef T value_type;
};
template <class T>
struct Derived : Base<T>
{
// Version 1: error on conforming compilers
value_type get();
// Version 2: OK, but unwieldy for repeated references
typename Base<T>::value_type get();
// Version 3: OK, but unwieldy for many types or deep inheritance
typedef typename Base<T>::value_type value_type;
value_type get();
// Version 4: why doesn't this work?
using typename Base<T>::value_type;
value_type get(); // GCC: `value_type' is not a type
};
我有一个带有一组分配器样式 typedef 的基类,我想在多个继承级别中继承它们。到目前为止我发现的最佳解决方案是上面的第 3 版,但我很好奇为什么第 4 版似乎不起作用。GCC 接受 using 声明,但似乎忽略了它。
我检查了 C++ 标准,C++ Prog。朗。第三版。[Stroustrup] 和 C++ 模板 [Vandevoorde, Josuttis],但似乎都没有解决 using-declarations 是否可以应用于依赖的基类类型。
如果查看另一个示例会有所帮助,请在 GCC 邮件列表上提出相同的问题,但没有真正回答。提问者表示他在其他地方看到过“使用 typename”,但 GCC 似乎不支持它。我没有其他符合标准的编译器可用于测试它。