为什么派生类找不到基类的类型别名?
Why can't my derived class find my base class's type alias?
让我们从代码示例开始,因为应该很容易看到正在发生的事情:
template <typename T>
struct Base
{
using Type = int;
};
template<typename T>
struct Derived : public Base<T>
{
// error: unknown type name 'Type'
using NewType = Type;
};
int main()
{}
我本来可以预期会找到基本的类型别名。但是,我尝试过的任何编译器(MSVC,Clang,GCC(似乎都喜欢此代码。
更令人惊讶的是,将派生的继承更改为:
struct Derived : public Base<int>
解决了问题。
我可以更改一些东西以允许派生以找到基本的别名吗?
,因为 Type
是一个因名称(这取决于模板Base<T>
(。您需要资格并使用typename
。您也可以使用Derived::
资格(正如OP本人弄清楚的那样(:
template<typename T>
struct Derived : public Base<T>
{
using NewType = typename Base<T>::Type;
// or
using NewType2 = typename Derived::Type;
};
您可以在此处阅读有关依赖名称的更多信息:
https://en.cppreference.com/w/cpp/language/depperentent_name
您如何理解C 中的相关名称
我必须在何处以及为什么要放置"模板"answers" typename"关键字?
为什么我必须通过此指针访问模板基类成员?
"在此范围中未声明"模板和继承的错误
相关文章:
- 继承模板类中的类型别名
- 为什么 GCC 在使用类型别名时处理 const reinterpret_cast不同?
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- 如何使用类型别名从模板化类中隐藏模板列表
- 如何检测类型类型别名?
- C++类型别名,其中值被替换
- 如何为流输出运算符提供重载<<模板'using'类型别名?
- 通过类型别名从构造函数转发模板推导
- C++中的严格别名规则和类型别名
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 什么是C++中的类型别名?
- 如何在不违反类型别名规则的情况下解释消息负载?
- 在模板派生类中继承具有类型别名的构造函数
- 类型别名允许分配任意指针,尽管 int* 是必需的
- 使用类型别名,例如使用 A = int(int)
- 模板类函数指针类型别名
- 类型别名和类似类型
- 泛型类型别名,它们彼此不兼容
- 具有类型别名的循环依赖项
- 为什么模板引用类型不能用作模板类型别名参数?